Hàm KeyMint

Trang này cung cấp thêm thông tin chi tiết và nguyên tắc để hỗ trợ những người triển khai lớp trừu tượng phần cứng (HAL) KeyMint. Tài liệu chính cho HAL là quy cách giao diện AIDL.

Sử dụng sai API

Người gọi có thể tạo khoá KeyMint bằng các uỷ quyền hợp lệ dưới dạng tham số API, nhưng điều này khiến các khoá kết quả không an toàn hoặc không dùng được. Các quy trình triển khai KeyMint không bắt buộc phải thất bại trong những trường hợp như vậy hoặc đưa ra thông tin chẩn đoán. Việc sử dụng các khoá quá nhỏ, chỉ định các tham số đầu vào không liên quan, sử dụng lại IV hoặc số chỉ dùng một lần, tạo khoá không có mục đích (do đó vô dụng), v.v. không được các hoạt động triển khai chẩn đoán.

Các ứng dụng, khung và Kho khoá Android có trách nhiệm đảm bảo rằng các lệnh gọi đến mô-đun KeyMint là hợp lý và hữu ích.

điểm truy cập addRngEntropy

Điểm truy cập addRngEntropy sẽ thêm entropy do người gọi cung cấp vào nhóm mà quá trình triển khai KeyMint dùng để tạo số ngẫu nhiên cho các khoá và IV.

Các hoạt động triển khai KeyMint cần kết hợp một cách an toàn entropy được cung cấp vào nhóm của chúng. Nhóm này cũng phải chứa entropy được tạo nội bộ từ một trình tạo số ngẫu nhiên phần cứng. Quá trình kết hợp phải được xử lý sao cho kẻ tấn công có toàn quyền kiểm soát các bit do addRngEntropy cung cấp hoặc các bit do phần cứng tạo (nhưng không phải cả hai) không có lợi thế đáng kể trong việc dự đoán các bit được tạo từ nhóm entropy.

Đặc điểm chính

Mỗi cơ chế (generateKey, importKeyimportWrappedKey) tạo khoá KeyMint sẽ trả về các đặc điểm của khoá mới tạo, được chia thành các cấp độ bảo mật phù hợp để thực thi từng đặc điểm. Các đặc điểm được trả về bao gồm tất cả các tham số được chỉ định để tạo khoá, ngoại trừ Tag::APPLICATION_IDTag::APPLICATION_DATA. Nếu các thẻ này có trong các tham số khoá, thì chúng sẽ bị xoá khỏi các đặc điểm được trả về để không thể tìm thấy giá trị của chúng bằng cách kiểm tra keyblob được trả về. Tuy nhiên, chúng được liên kết bằng phương thức mã hoá với keyblob, do đó, nếu bạn không cung cấp đúng giá trị khi dùng khoá, thì việc sử dụng sẽ không thành công. Tương tự, Tag::ROOT_OF_TRUST được liên kết bằng mật mã với khoá, nhưng không thể chỉ định trong quá trình tạo hoặc nhập khoá và không bao giờ được trả về.

Ngoài các thẻ được cung cấp, việc triển khai KeyMint cũng thêm Tag::ORIGIN, cho biết cách tạo khoá (KeyOrigin::GENERATED, KeyOrigin::IMPORTED hoặc KeyOrigin::SECURELY_IMPORTED).

Tính năng chống khôi phục

Khả năng chống quay về phiên bản cũ được biểu thị bằng Tag::ROLLBACK_RESISTANCE và có nghĩa là sau khi một khoá bị xoá bằng deleteKey hoặc deleteAllKeys, phần cứng bảo mật sẽ đảm bảo rằng khoá đó không bao giờ dùng được nữa.

Các phương thức triển khai KeyMint trả về tài liệu khoá đã tạo hoặc nhập cho phương thức gọi dưới dạng keyblob, một biểu mẫu đã mã hoá và xác thực. Khi Kho khoá xoá keyblob, khoá sẽ biến mất, nhưng kẻ tấn công đã tìm cách truy xuất nội dung khoá trước đó có thể khôi phục khoá đó vào thiết bị.

Khoá có khả năng chống khôi phục nếu phần cứng bảo mật đảm bảo rằng các khoá đã xoá không thể khôi phục sau này. Việc này thường được thực hiện bằng cách lưu trữ siêu dữ liệu khoá bổ sung ở một vị trí đáng tin cậy mà kẻ tấn công không thể thao túng. Trên thiết bị di động, cơ chế được dùng cho việc này thường là các khối bộ nhớ được bảo vệ chống phát lại (RPMB). Vì số lượng khoá có thể được tạo về cơ bản là không giới hạn và bộ nhớ đáng tin cậy dùng để chống khôi phục có thể bị giới hạn về kích thước, nên quá trình triển khai có thể không thực hiện được các yêu cầu tạo khoá chống khôi phục khi bộ nhớ đầy.

bắt đầu

Điểm truy cập begin() bắt đầu một hoạt động mật mã bằng khoá đã chỉ định, cho mục đích đã chỉ định, với các tham số đã chỉ định (nếu thích hợp). Phương thức này trả về một đối tượng IKeyMintOperation Binder mới dùng để hoàn tất thao tác. Ngoài ra, một giá trị thử thách sẽ được trả về và được dùng làm một phần của mã xác thực trong các thao tác đã xác thực.

Một phương thức triển khai KeyMint hỗ trợ ít nhất 16 thao tác đồng thời. Kho khoá sử dụng tối đa 15 khoá, để lại một khoá cho vold dùng để mã hoá mật khẩu. Khi Kho khoá có 15 thao tác đang diễn ra (begin() đã được gọi, nhưng finish hoặc abort chưa được gọi) và nhận được yêu cầu bắt đầu thao tác thứ 16, Kho khoá sẽ gọi abort() trên thao tác được sử dụng gần đây nhất để giảm số lượng thao tác đang hoạt động xuống 14 trước khi gọi begin() để bắt đầu thao tác mới được yêu cầu.

Nếu Tag::APPLICATION_ID hoặc Tag::APPLICATION_DATA được chỉ định trong quá trình tạo hoặc nhập khoá, thì các lệnh gọi đến begin() phải bao gồm những thẻ đó với các giá trị được chỉ định ban đầu trong đối số params cho phương thức này.

Xử lý lỗi

Nếu một phương thức trên IKeyMintOperation trả về mã lỗi khác với ErrorCode::OK, thì thao tác sẽ bị huỷ và đối tượng Binder của thao tác sẽ không hợp lệ. Mọi hoạt động sử dụng đối tượng trong tương lai đều trả về ErrorCode::INVALID_OPERATION_HANDLE.

Thực thi việc uỷ quyền

Việc thực thi hoạt động uỷ quyền khoá chủ yếu được thực hiện trong begin(). Một trường hợp ngoại lệ là khi khoá có một hoặc nhiều giá trị Tag::USER_SECURE_ID và không có giá trị Tag::AUTH_TIMEOUT.

Trong trường hợp này, khoá yêu cầu uỷ quyền cho mỗi thao tác và các phương thức update() hoặc finish() sẽ nhận được mã thông báo uỷ quyền trong đối số authToken. Để đảm bảo mã thông báo hợp lệ, việc triển khai KeyMint sẽ:

  • Xác minh chữ ký HMAC trên mã thông báo uỷ quyền.
  • Kiểm tra để đảm bảo mã thông báo chứa một mã nhận dạng người dùng bảo mật khớp với mã nhận dạng được liên kết với khoá.
  • Kiểm tra để đảm bảo loại uỷ quyền của mã thông báo khớp với Tag::USER_AUTH_TYPE của khoá.
  • Kiểm tra để đảm bảo mã thông báo chứa giá trị thử thách cho thao tác hiện tại trong trường thử thách.

Nếu không đáp ứng các điều kiện này, KeyMint sẽ trả về ErrorCode::KEY_USER_NOT_AUTHENTICATED.

Trình gọi cung cấp mã thông báo xác thực cho mọi lệnh gọi đến update()finish(). Quy trình triển khai chỉ có thể xác thực mã thông báo một lần.