加密引擎

概述

加密引擎 (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:在调用任何准备函数之前调用一次。

  • unprepare_crypt_hardware:在所有解除准备函数调用完毕后调用一次。

  • prepare_cipher_request/prepare_hash_request:在执行每个相应请求之前调用。如果需要进行一些处理或其他准备工作,请在此处完成。

  • unprepare_cipher_request/unprepare_hash_request:在处理每个请求之后调用。清理/撤销在准备函数中完成的工作。

  • 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()