Thẻ uỷ quyền

API KeyMint (trước đây là Keymaster) sử dụng rộng rãi thẻ uỷ quyền, là các cặp tên-giá trị. Mỗi thẻ có thể có:

  • Tên enum có giá trị được liên kết
  • Một loại được liên kết (ví dụ: số nguyên, byte, ngày, enum), bao gồm cả chỉ báo về việc có cho phép nhiều giá trị hay không

Ví dụ: thẻ có tên Tag::BLOCK_MODE có giá trị enum cơ sở là 4 và một điểm đánh dấu loại TagType::ENUM_REP cho biết giá trị được liên kết là một enum có thể lặp lại (trong trường hợp này là BlockMode).

Thẻ có hai chức năng trên API:

  • Là các tham số cho một thao tác được thực hiện trên API, chẳng hạn như Tag::MAC_LENGTH trong một thao tác ký HMAC cho biết độ dài HMAC được yêu cầu.
  • đặc điểm khoá, các giá trị được liên kết vĩnh viễn với một khoá cụ thể (tức là có trong blob khoá), ví dụ: Tag::EC_CURVE cho biết khoá dành cho đường cong elip nào. Mỗi đặc điểm chính đều được liên kết với một cấp độ bảo mật cho biết phần nào của hệ thống thực thi thuộc tính:
    • Một đặc điểm khoá có cấp độ bảo mật TRUSTED_ENVIRONMENT hoặc STRONGBOX được thực thi trong phần cứng bảo mật.
    • Đặc điểm chính có cấp độ bảo mật SOFTWARE hoặc KEYSTORE chỉ được dịch vụ hệ thống keystore2 thực thi (do đó, đặc điểm như vậy không có khả năng chống lại việc xâm nhập hệ điều hành).

Nhiều thẻ đóng vai trò là cả tham số đặc điểm chính :

  • Các đặc điểm chính cho biết tập hợp các tham số được phép cho một khoá, ví dụ:
    • Tag::PURPOSE của khoá ECDSA có thể bao gồm cả SIGNAGREE_KEY.
    • Tag::BLOCK_MODE cho khoá AES có thể bao gồm các chế độ ECB, CBC và CTR.
  • Sau đó, yêu cầu begin() sẽ bao gồm một giá trị tham số cụ thể cho thao tác, ví dụ:
    • begin() có một tham số mục đích rõ ràng phải khớp với một trong các giá trị Tag::PURPOSE của đặc điểm chính.
    • begin() cho một thao tác AES cần có một giá trị duy nhất cho Tag::BLOCK_MODE trong trường params. Giá trị này phải khớp với một trong các giá trị trong đặc điểm khoá.

Chức năng kép này đặc biệt phù hợp với việc thu thập các thẻ được truyền dưới dạng keyParams trong thao tác tạo hoặc nhập khoá.

  • Một số thẻ đóng vai trò là tham số cho chính thao tác tạo khoá. Ví dụ: thẻ Tag::CERTIFICATE_SUBJECT chỉ ảnh hưởng đến quy trình tạo khoá (bất đối xứng) bằng cách kiểm soát một trường trong chứng chỉ X.509 được trả về.
  • Các thẻ khác được liên kết với khoá mới tạo dưới dạng đặc điểm khoá và được đóng gói trong keyblob được trả về để chúng được liên kết vĩnh viễn với khoá.

Bạn có thể tìm thấy thông tin chi tiết về các giá trị thẻ trong các quy cách giao diện HAL sau đây:

  • KeyMint – Tất cả các thẻ đều được xác định trong Tag.aidl trên nhánh phát hành Android có liên quan.
  • Keymaster – Các thẻ được xác định trong platform/hardware/interfaces/keymaster/keymaster-version/types.hal cho từng keymaster-version tương ứng, chẳng hạn như 3.0/types.hal cho Keymaster 3 và 4.0/types.hal cho Keymaster 4. Đối với Keymaster 2 trở xuống, các thẻ được xác định trong platform/hardware/libhardware/include/hardware/keymaster_defs.h.