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

Phương thức gọi có thể tạo khoá KeyMint bằng các quyền hợp lệ dưới dạng tham số API, nhưng điều đó sẽ khiến khoá thu được không an toàn hoặc không sử dụng được. Các hoạt động triển khai KeyMint không bắt buộc phải không thành công trong những trường hợp như vậy hoặc đưa ra chẩn đoán. Việc sử dụng khoá quá nhỏ, thông số kỹ thuật của 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 đó không hữu ích) và các vấn đề tương tự không được chẩn đoán bằng cách triển khai.

Ứ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 phương thức gọi cung cấp vào nhóm mà quá trình triển khai KeyMint sử dụng để tạo số ngẫu nhiên, cho khoá và IV.

Các hoạt động triển khai KeyMint cần phải trộn lẫn entropy được cung cấp một cách an toàn 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ừ trình tạo số ngẫu nhiên phần cứng. Bạn nên xử lý việc trộn để kẻ tấn công có quyền kiểm soát hoàn toàn các bit do addRngEntropy cung cấp hoặc các bit do phần cứng tạo ra (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 tham số khoá, thì các thẻ này sẽ bị xoá khỏi các đặc điểm được trả về để không thể tìm thấy giá trị của các thẻ đó bằng cách kiểm tra khoá blob được trả về. Tuy nhiên, các giá trị này được liên kết bằng phương thức mã hoá với keyblob, vì vậy, nếu bạn không cung cấp đúng giá trị khi sử 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ể được 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, quá trình 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 rollback đượ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ờ được sử dụng lại.

Các hoạt động triển khai KeyMint sẽ 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à được xác thực. Khi Kho khoá xoá keyblob, khoá sẽ biến mất, nhưng kẻ tấn công đã từng truy xuất được tài liệu khoá có thể khôi phục khoá đó vào thiết bị.

Khoá có khả năng chống rollback nếu phần cứng bảo mật đảm bảo rằng các khoá đã xoá không thể được khôi phục sau này. Điều 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ế 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ể tạo về cơ bản là không giới hạn và bộ nhớ đáng tin cậy dùng để chống rollback có thể bị giới hạn về kích thước, nên việc triển khai có thể không thực hiện được các yêu cầu tạo khoá chống rollback khi bộ nhớ đầy.

bắt đầu

Điểm truy cập begin() bắt đầu một hoạt động mã hoá bằng cách sử dụ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 Binder IKeyMintOperation 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 trong mã thông báo xác thực trong các thao tác đã xác thực.

Việ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 sử 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 còn 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 các 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ột 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 lần sử dụng đối tượng trong tương lai đều trả về ErrorCode::INVALID_OPERATION_HANDLE.

Thực thi uỷ quyền

Việc thực thi uỷ quyền khoá chủ yếu được thực hiện trong begin(). Trường hợp ngoại lệ duy nhất 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 xác thực trong đối số authToken. Để đảm bảo mã thông báo hợp lệ, quá trình triển khai KeyMint:

  • Xác minh chữ ký HMAC trên mã thông báo xác thực.
  • Kiểm tra để đảm bảo mã thông báo chứa mã nhận dạng người dùng an toàn 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 xác thực 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ách thức cho phép toán hiện tại trong trường thách thức.

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

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