加密引擎¶
概述¶
加密引擎 (CE) API 是一个加密队列管理器。
要求¶
您必须在您的转换上下文 your_tfm_ctx 的开头放置结构体 crypto_engine
struct your_tfm_ctx {
struct crypto_engine engine;
...
};
加密引擎只管理以 crypto_async_request 形式存在的异步请求。它无法知道底层的请求类型,因此只能访问转换结构。无法使用 container_of 访问上下文。此外,引擎对您的结构 “struct your_tfm_ctx
” 一无所知。引擎假设(要求)将已知的成员 struct crypto_engine
放置在开头。
操作顺序¶
您需要通过 crypto_engine_alloc_init()
获取 struct 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()