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
  • Một loại được liên kết (ví dụ: số nguyên, byte, ngày, enum), bao gồm cả thông tin cho biết liệu 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à đ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ẻ thực hiện hai chức năng trên API:

  • Ví dụ: dưới dạng tham số cho một thao tác được thực hiện trên API, Tag::MAC_LENGTH trên thao tác ký HMAC cho biết độ dài HMAC được yêu cầu.
  • các đặc điểm của 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 đượ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 kiểm soát thuộc tính:
    • Một đặ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.
    • 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 (và do đó, đặc điểm đó không có khả năng chống lại việc xâm phạm 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 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ác đặc điểm chính.
    • begin() cho một thao tác AES cần bao gồm 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á.

Hàm 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 một thao tác tạo khoá hoặc nhập.

  • 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 quá 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ề để liên kết vĩnh viễn với khoá.

Bạn có thể xem thông tin chi tiết về giá trị thẻ trong các thông số kỹ thuật giao diện HAL sau:

  • 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 mỗi 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.