Chứng thực khoá và giá trị nhận dạng

Kho khoá cung cấp một nơi an toàn hơn để tạo, lưu trữ và sử dụng khoá mã hoá theo cách có kiểm soát. Khi có và 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à Keymaster sẽ thực thi các quy định hạn chế khó bị phá vỡ.

Tuy nhiên, điều này chỉ đúng nếu bạn biết rằng các khoá kho khoá nằm trong bộ nhớ được hỗ trợ phần cứng. Trong Keymaster 1, các ứng dụng hoặc máy chủ từ xa không có cách nào để xác minh một cách đáng tin cậy xem đây có phải là trường hợp hay không. Trình nền kho khoá đã tải HAL keymaster hiện có và tin tưởng mọi nội dung mà HAL nói về việc sao lưu khoá bằng phần cứng.

Để khắc phục vấn đề này, Keymaster đã ra mắt tính năng chứng thực khoá trong Android 7.0 (Keymaster 2) và tính năng chứng thực danh tính trong Android 8.0 (Keymaster 3).

Chứng thực khoá nhằm cung cấp một cách để xác định chắc chắn liệu một cặp khoá bất đối xứng có được hỗ trợ phần cứng hay không, các thuộc tính của khoá là gì và những quy tắc ràng buộc nào được áp dụng cho việc sử dụng khoá.

Chứng thực danh tính 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.

Chứng thực khoá

Để hỗ trợ chứng thực khoá, Android 7.0 đã giới thiệu một tập hợp thẻ, loại và phương thức cho HAL.

Thẻ từ khóa

  • 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á được trả về từ generateKey mà chứng thực được tạo.
  • attestParams là danh sách mọi tham số cần thiết để chứng thực. Bao gồm Tag::ATTESTATION_CHALLENGE và có thể là Tag::RESET_SINCE_ID_ROTATION, cũng như Tag::APPLICATION_IDTag::APPLICATION_DATA. Hai giá trị sau là cần thiết để giải mã blob khoá nếu các giá trị này được chỉ định trong quá trình tạo khoá.
  • certChain là tham số đầu ra, trả về một mảng các chứng chỉ. Mục 0 là chứng chỉ chứng thực, nghĩa là mục này chứng thực 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ì phương thức này có thể được gọi bất cứ lúc nào và không cần đáp ứng các quy tắc hạn chế về 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 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ó một tiện ích chứng thực không bắt buộc chứa nội dung mô tả khoá được chứng thực. Chứng chỉ được ký bằng 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á đượ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 nào khác. Một số trường chỉ định giá trị trường cố định. Các bài kiểm thử CTS xác thực rằng nội dung chứng chỉ chính xác như đã xác định.

SEQUENCE của 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á DER ASN.1.

TBSCertificate SEQUENCE

Tên trường (xem RFC 5280) Giá trị
version INTEGER 2 (nghĩa là chứng chỉ v3)
serialNumber INTEGER 1 (giá trị cố định: giống nhau trên tất 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 TỔ HỢP gồm hai ngày, chứa các giá trị của Tag::ACTIVE_DATETIMETag::USAGE_EXPIRE_DATETIME. Các giá trị đó được 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 trình bày ngày chính xác trong chứng chỉ.
Nếu không có Tag::ACTIVE_DATETIME, hãy sử 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" (khoá Kho khoá Android) (giá trị cố định: giống nhau trên tất 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 không được đặt.
extensions/CRL Distribution Points Giá trị TBD
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ã 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. Tệp 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 Keymaster/KeyMint 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à đúng, sự vắng mặt của thẻ có nghĩa là sai.
BIGNUM Không có thẻ nào có loại này, vì vậy không có mối liên kết nào được xác định.
BYTES OCTET_STRING

Lược đồ

Nội dung tiện ích chứng thực được mô tả bằng giản đồ ASN.1 sau đây:

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 Keymaster/KeyMint
1Keymaster phiên bản 2.0
2Keymaster phiên bản 3.0
3Keymaster phiên bản 4.0
4Keymaster phiên bản 4.1
100KeyMint phiên bản 1.0
200KeyMint phiên bản 2.0
300KeyMint phiên bản 3.0
attestationSecurityLevel

Mức bảo mật của vị trí lưu trữ khoá được chứng thực.

keymasterVersion/keyMintVersion
Phiên bản triển khai lớp trừu tượng phần cứng (HAL) Keymaster/KeyMint.
Giá trịPhiên bản Keymaster/KeyMint
2Keymaster phiên bản 2.0
3Keymaster phiên bản 3.0
4Keymaster phiên bản 4.0
41Keymaster phiên bản 4.1
100KeyMint phiên bản 1.0
200KeyMint phiên bản 2.0
300KeyMint phiên bản 3.0
keymasterSecurityLevel/keyMintSecurityLevel
Mức bảo mật của quy trình triển khai Keymaster/KeyMint.
attestationChallenge
Thử thách được cung cấp 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 bạn 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 Keymaster/KeyMint do hệ thống Android thực thi. Thông tin này được thu thập hoặc tạo bằng mã trong nền tảng và được lưu trữ trong phân vùng hệ thống của thiết bị. Bạn có thể tin tưởng thiết bị 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à verifiedBootStateVerified).
hardwareEnforced
Danh sách uỷ quyền Keymaster/KeyMint 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ằng 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 giao tiếp an toàn 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ột phần tử liên quan đến Kho khoá (ví dụ: cặp khoá và chứng thực) có khả năng chống chịu trước 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à verifiedBootStateVerified).
TrustedEnvironment An toàn miễn là Môi trường thực thi đáng tin cậy (TEE) không bị xâm phạm. Các yêu cầu về tính năng tách biệt cho TEE được xác định trong các phần 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 của Android. TEE có khả năng chống xâm phạm từ xa và khả năng chống xâm phạm trung bình khi bị tấn công phần cứng trực tiếp.
StrongBox An toàn miễn là StrongBox không bị xâm phạm. StrongBox được triển khai trong một phần tử bảo mật 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 của Android. StrongBox có khả năng chống xâm nhập từ xa và xâm nhập bằng cuộc tấn công phần cứng trực tiếp (ví dụ: can thiệp vào phần cứng 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. Thông số kỹ thuật là nguồn đáng tin cậy về các thẻ uỷ quyền: ý nghĩa, định dạng nội dung, liệu các thẻ này có xuất hiện trong trường softwareEnforced hay hardwareEnforced trong đối tượng KeyDescription hay không, liệu các thẻ này 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 có một thẻ theo ngữ cảnh EXPLICIT bằng số thẻ Keymaster/KeyMint, cho phép trình bày dữ liệu trong AuthorizationList một cách gọn gàng hơn. Do đó, trình phân tích cú pháp ASN.1 phải biết loại dữ liệu dự kiến cho từng thẻ theo ngữ cảnh cụ thể. Ví dụ: Tag::USER_AUTH_TYPE được xác định là ENUM | 504. Trong giao thức mở rộng 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ẻ 504 theo ngữ cảnh cụ thể 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ặc EC.

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.
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.
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ềnTag::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 KeyMint Tag::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 Keymaster 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.
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.

trustedUserPresenceRequired

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.
trustedConfirmationRequired

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.

unlockedDeviceRequired

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.

allApplications

Tương ứng với thẻ uỷ quyền Tag::ALL_APPLICATIONS. Thẻ này dùng giá trị mã nhận dạng thẻ là 600.

Cho biết liệu mọi ứng dụng trên một thiết bị có thể truy cập vào cặp khoá hay không.

applicationId
Tương ứng với thẻ uỷ quyền Tag::APPLICATION_ID. Thẻ này dùng giá trị mã nhận dạng thẻ là 601.
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.

rollbackResistant

Chỉ trình bày trong quy trình chứng thực khoá phiên bản 1 và 2.

Tương ứng với thẻ uỷ quyền Tag::ROLLBACK_RESISTANT. Thẻ này dùng giá trị mã nhận dạng thẻ là 703.

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 Keymaster 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ẻ Keymaster 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ẻ Keymaster 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ẻ Keymaster 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ẻ Keymaster 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.

Các trường RootOfTrust

verifiedBootKey
Hash 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 được xác minh. Bạn nên sử dụng SHA-256.
deviceLocked
Liệu 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ý được xác minh thành công bằng tính năng Xác minh quy trình khởi độ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 quy trình triển khai tham chiếu Quy trình khởi động được xác minh của 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 Chuỗi tin cậy đầy đủ mở rộng 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 bằng tính năng Xác minh quy trình khởi động. Ở 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, là chứng chỉ do nhà sản xuất thiết bị nhúng vào ROM của thiết bị lúc xuất xưởng.
SelfSigned YELLOW Tương tự như Verified, ngoại trừ việc 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ị bên ngoài phạm vi. Ở 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ể bao gồm 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ớp Signature do một lệnh gọi đến getPackageInfo() trả về. Đoạn mã sau đây cho thấy một tập ví dụ:

{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
    

Mã 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 thời gian", được tính bằng cách chia giá trị của Tag::CREATION_DATETIME cho 2592000000, 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ủa Tag::APPLICATION_ID
  • R là 1 nếu Tag::RESET_SINCE_ID_ROTATION có trong tham số attest_params cho lệnh gọi attest_key hoặc 0 nếu không có thẻ này.
  • HBK là một bí mật liên kết với phần cứng duy nhất 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 chất duy nhất có xác suất dựa trên 128 bit entropy). HBK phải được lấy từ tài liệu khoá hợp nhất thông qua HMAC hoặc AES_CMAC.

Cắt bớt đầu ra HMAC_SHA256 thành 128 bit.

Khoá và chứng chỉ chứng thực

Hai khoá, một khoá RSA và một khoá ECDSA, cùng với 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 ra mắt 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. Tính năng Cung cấp khoá từ xa cung cấp cho các thiết bị trong trường hợp thực tế các 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ỉ do nhà máy cung cấp.

Nhiều IMEI

Android 14 hỗ trợ nhiều IMEI trong bản ghi Chứng thực khoá Android. Nhà sản xuất thiết bị gốc (OEM) có thể triển khai tính năng này bằng cách thêm thẻ KeyMint cho IMEI thứ hai. Ngày càng phổ biến khi các thiết bị có nhiều đài phát sóng di động và OEM hiện có thể hỗ trợ các thiết bị có hai IMEI.

OEM bắt buộc phải có IMEI phụ (nếu có trên thiết bị của họ) để được cung cấp cho (các) phương thức triển khai KeyMint để các phương thức triển khai đó có thể chứng thực IMEI phụ theo cách tương tự như cách chứng thực IMEI đầu tiên

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:

  {
        1 : int,   ; certificates issued
  }

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 độ.

Chứng thực giấy tờ tuỳ thân

Android 8.0 có tính năng hỗ trợ không bắt buộc cho việc chứng thực giấy tờ tuỳ thân cho các thiết bị có Keymaster 3. Chứng thực danh tính 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ù đây là tính năng không bắt buộc, nhưng bạn nên hỗ trợ tính năng này cho tất cả các hoạt động triển khai Keymaster 3 vì tính năng này có thể 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 chạm thực sự trở nên an toàn hơn (vì bên từ xa có thể chắc chắn rằng họ đ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ỉ Môi trường thực thi đáng tin cậy (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ư giá trị nhận dạng do các khung Android báo cáo. Không thể thao túng bản sao của giá trị nhận dạng do TEE giữ 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 hành vi giả mạo.

Giao diện API chính để xác thực giấy tờ tuỳ thân được xây dựng dựa trên cơ chế xác thực khoá hiện có được giới thiệu với Keymaster 2. Khi yêu cầu chứng chỉ chứng thực cho khoá do keymaster giữ, phương thức gọi có thể yêu cầu đưa 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 lưu giữ trong TEE, thì chuỗi chứng chỉ sẽ quay 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ả giá trị nhận dạng phần cứng, là do TEE viết. Khi được yêu cầu đưa giá trị nhận dạng phần cứng vào chứng chỉ chứng thực, TEE chỉ chứng thực các giá trị nhận dạng được lưu trữ trong bộ nhớ của TEE, như được điền sẵn tại nhà máy.

Thuộc tính bộ nhớ

Bộ nhớ lưu trữ giá trị 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ị đượ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 dữ liệu bắt nguồn từ giá trị nhận dạng này. Huỷ bỏ vĩnh viễn có nghĩa là dữ liệu sẽ bị xoá hoàn toàn, vì vậy, việc đặt lại về trạng thái ban đầu cũng như bất kỳ quy trình nào khác được thực hiện trên thiết bị đều không thể khôi phục dữ liệu đó. Điều này đặc biệt quan trọng đối với các thiết bị mà người dùng đã mở khoá trình tải khởi động, thay đổi phần mềm hệ thống và sửa đổi giá trị nhận dạng do khung Android trả về.
  • Cơ sở bảo hành theo yêu cầu của khách hàng (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, một thiết bị đã trải qua quy trình RMA có thể thực hiện lại quy trình chứng thực danh tính. 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 đó sẽ cho phép họ lấy chứng thực về 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ừ giá trị nhận dạng được lưu trữ trong bộ nhớ.
  • Bộ nhớ có khả năng phát hiện hành vi can thiệp: Nếu nội dung của bộ nhớ đã bị sửa đổi, thì TEE sẽ coi nội dung đó giống như các bản sao của nội dung đã bị huỷ bỏ và từ chối mọi nỗ lực chứng thực danh tính. Việc 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ớ không chứa giá trị nhận dạng ban đầu. Vì quy trình chứng thực giấy tờ tuỳ thân liên quan đến một thử thách, nên phương thức gọi luôn cung cấp 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 giá trị ban đầu. Việc lưu trữ hàm băm bảo mật của các giá trị ban đầu thay vì giá trị sẽ 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ị bắt nguồn từ mã nhận dạng trong cấu trúc S sau đây. Không lưu trữ các bản sao khác của giá trị mã nhận dạng, ngoại trừ các vị trí 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 can thiệp vào hệ thống:

S = D || HMAC(HBK, D)

trong đó:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC là cấu trúc HMAC với hàm băm bảo mật thích hợp (nên dùng SHA-256)
  • HBK là khoá liên kết với phần cứng không được dùng cho bất kỳ mục đích nào khác
  • ID1...IDn là các giá trị mã nhận dạng ban đầu; việc liên kết một giá trị cụ thể với một chỉ mục cụ thể phụ thuộc vào cách 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ị việc 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 hàm băm mã nhận dạng riêng lẻ hoặc hàm băm 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 cá nhân nào bị sửa đổi/hỏng. Ngoài ra, các hoạt động triển khai phải sử dụng phương thức 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à 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à việc so khớp chính xác của bất kỳ phần nào trong kiểm thử.

Giá trị nhận dạng phần cứng

Tính năng chứng thực danh tính hỗ trợ các giá trị nhận dạng phần cứng sau:

  1. Tên thương hiệu do Build.BRAND trả về trong Android
  2. Tên thiết bị do Build.DEVICE trả về trong Android
  3. Tên sản phẩm do Build.PRODUCT trả về trong Android
  4. Tên nhà sản xuất, do Build.MANUFACTURER trả về trong Android
  5. Tên mẫu, do Build.MODEL trả về trong Android
  6. Số sê-ri
  7. Số IMEI của tất cả đài
  8. MEID của tất cả đài

Để 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ả thiết bị chạy Android đều có 6 quyền đầu tiên và chúng là cần thiết để tính năng này hoạt động. Nếu có bất kỳ đài phát di động tích hợp nào, thiết bị cũng phải hỗ trợ chứng thực cho IMEI và/hoặc MEID của đài phát.

Yêu cầu chứng thực giấy tờ tuỳ thân bằng cách thực hiện chứng thực khoá và đưa giá trị nhận dạng thiết bị để chứng thực vào yêu cầu. Các 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 để 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 các giá trị nhận dạng dạng số. Mỗi giá trị nhận dạng để 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 nữa), thì mọi yêu cầu chứng thực khoá có chứa 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 danh tính và một hoặc nhiều thẻ ở trên đã được đưa vào yêu cầu chứng thực khoá, thì TEE sẽ xác minh giá trị nhận dạng được cung cấp cùng với từng thẻ khớp với bản sao của giá trị nhận dạng phần cứng. Nếu một hoặc nhiều giá trị nhận dạng không khớp, toàn bộ quy trình chứng thực sẽ không thành công với ErrorCode::CANNOT_ATTEST_IDS. Bạn có thể cung cấp cùng một thẻ nhiều lần. Điều này có thể hữu ích, chẳng hạn như 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 là hợp lệ nếu giá trị được cung cấp với 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 quá trình chứng thực thành công, các mã nhận dạng đã 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 giản đồ ở trên. Các thay đổi từ giản đồ chứng thực Keymaster 2 được in đậm kèm theo nhận xét.

API Java

Phần này chỉ mang tính chất cung cấp thông tin. Trình triển khai Keymaster không triển khai cũng 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 ứ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 thuộc tính này theo cách khác nhau, đó là lý do quan trọng khiến phần này không được coi là quy tắc.