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ị liên kết
  • Loại liên kết (ví dụ: số nguyên, byte, ngày, enum), bao gồm cả chỉ báo cho biết 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à dấu loại TagType::ENUM_REP cho biết giá trị liên kết là enum có thể lặp lại (trong trường hợp này là BlockMode).

Thẻ thực hiện chức năng kép trên API:

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

Nhiều thẻ hoạt động vừa là đặc điểm chính vừa là tham số:

  • Các đặc điểm chính cho biết tập hợp 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ó 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 thao tác AES cần bao gồm một giá trị duy nhất cho Tag::BLOCK_MODE trong trường params, phải khớp với một trong các giá trị trong đặc điểm chính.

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

  • Một số thẻ hoạt động như tham số cho chính thao tác tạo khoá đó. Ví dụ: thẻ Tag::CERTIFICATE_SUBJECT chỉ ảnh hưởng đến quá trình tạo khoá (không đố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 chính 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ề giá trị thẻ trong các thông số kỹ thuật giao diện HAL sau đây:

  • KeyMint – Tất cả thẻ được xác định trong Tag.aidl trên nhánh phát hành Android có liên quan.
  • Keymaster – 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, thẻ được xác định trong platform/hardware/libhardware/include/hardware/keymaster_defs.h.