Crypto API - 8. 加密引擎
概述
加密引擎 (CE) API 是一个加密队列管理器。
要求
您必须在您的转换上下文 your_tfm_ctx 的开头放置结构体 crypto_engine:
struct your_tfm_ctx {
struct crypto_engine engine;
...
};
加密引擎仅能管理以 crypto_async_request 形式的异步请求。它无法知道底层请求类型,因此只能访问转换结构体(transform structure)。无法使用 container_of 访问上下文。此外,引擎对您的结构体 “struct your_tfm_ctx” 一无所知。引擎假设(要求)已知成员结构体 crypto_engine 放置在开头。
操作顺序
您需要通过 crypto_engine_alloc_init() 获取一个结构体 crypto_engine。使用 crypto_engine_start() 启动它。完成工作后,使用 crypto_engine_stop() 关闭引擎,并使用 crypto_engine_exit() 销毁引擎。
在传输任何请求之前,您需要通过提供以下函数来填充上下文 enginectx:
- prepare_crypt_hardware: 在调用任何 prepare 函数之前调用一次。
- unprepare_crypt_hardware: 在调用所有 unprepare 函数之后调用一次。
- prepare_cipher_request/prepare_hash_request: 在执行每个对应的请求之前调用。如果需要进行某些处理或其他准备工作,请在此处进行。
- unprepare_cipher_request/unprepare_hash_request: 在处理每个请求后调用。清理 / 撤消 prepare 函数中完成的工作。
- cipher_one_request/hash_one_request: 通过执行操作处理当前请求。
请注意,这些函数访问收到的请求关联的 crypto_async_request 结构体。您可以通过以下方式获取原始请求:
container_of(areq, struct yourrequesttype_request, base);
当驱动程序收到crypto_request时,必须通过以下方法之一将其传输到加密引擎:
- crypto_transfer_aead_request_to_engine()
- crypto_transfer_akcipher_request_to_engine()
- crypto_transfer_hash_request_to_engine()
- crypto_transfer_kpp_request_to_engine()
- crypto_transfer_skcipher_request_to_engine()
在请求过程结束时,需要调用以下函数之一:
- crypto_finalize_aead_request()
- crypto_finalize_akcipher_request()
- crypto_finalize_hash_request()
- crypto_finalize_kpp_request()
- crypto_finalize_skcipher_request()
ref: https://www.kernel.org/doc/html/latest/crypto/crypto_engine.html