加密引擎

概述

加密引擎 (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()