162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ciCrypto Engine
462306a36Sopenharmony_ci=============
562306a36Sopenharmony_ci
662306a36Sopenharmony_ciOverview
762306a36Sopenharmony_ci--------
862306a36Sopenharmony_ciThe crypto engine (CE) API is a crypto queue manager.
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciRequirement
1162306a36Sopenharmony_ci-----------
1262306a36Sopenharmony_ciYou must put, at the start of your transform context your_tfm_ctx, the structure
1362306a36Sopenharmony_cicrypto_engine:
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci::
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	struct your_tfm_ctx {
1862306a36Sopenharmony_ci		struct crypto_engine engine;
1962306a36Sopenharmony_ci		...
2062306a36Sopenharmony_ci	};
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciThe crypto engine only manages asynchronous requests in the form of
2362306a36Sopenharmony_cicrypto_async_request. It cannot know the underlying request type and thus only
2462306a36Sopenharmony_cihas access to the transform structure. It is not possible to access the context
2562306a36Sopenharmony_ciusing container_of. In addition, the engine knows nothing about your
2662306a36Sopenharmony_cistructure "``struct your_tfm_ctx``". The engine assumes (requires) the placement
2762306a36Sopenharmony_ciof the known member ``struct crypto_engine`` at the beginning.
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciOrder of operations
3062306a36Sopenharmony_ci-------------------
3162306a36Sopenharmony_ciYou are required to obtain a struct crypto_engine via ``crypto_engine_alloc_init()``.
3262306a36Sopenharmony_ciStart it via ``crypto_engine_start()``. When finished with your work, shut down the
3362306a36Sopenharmony_ciengine using ``crypto_engine_stop()`` and destroy the engine with
3462306a36Sopenharmony_ci``crypto_engine_exit()``.
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciBefore transferring any request, you have to fill the context enginectx by
3762306a36Sopenharmony_ciproviding functions for the following:
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci* ``prepare_crypt_hardware``: Called once before any prepare functions are
4062306a36Sopenharmony_ci  called.
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci* ``unprepare_crypt_hardware``: Called once after all unprepare functions have
4362306a36Sopenharmony_ci  been called.
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci* ``prepare_cipher_request``/``prepare_hash_request``: Called before each
4662306a36Sopenharmony_ci  corresponding request is performed. If some processing or other preparatory
4762306a36Sopenharmony_ci  work is required, do it here.
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci* ``unprepare_cipher_request``/``unprepare_hash_request``: Called after each
5062306a36Sopenharmony_ci  request is handled. Clean up / undo what was done in the prepare function.
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci* ``cipher_one_request``/``hash_one_request``: Handle the current request by
5362306a36Sopenharmony_ci  performing the operation.
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ciNote that these functions access the crypto_async_request structure
5662306a36Sopenharmony_ciassociated with the received request. You are able to retrieve the original
5762306a36Sopenharmony_cirequest by using:
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci::
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	container_of(areq, struct yourrequesttype_request, base);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciWhen your driver receives a crypto_request, you must to transfer it to
6462306a36Sopenharmony_cithe crypto engine via one of:
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci* crypto_transfer_aead_request_to_engine()
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci* crypto_transfer_akcipher_request_to_engine()
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci* crypto_transfer_hash_request_to_engine()
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci* crypto_transfer_kpp_request_to_engine()
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci* crypto_transfer_skcipher_request_to_engine()
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ciAt the end of the request process, a call to one of the following functions is needed:
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci* crypto_finalize_aead_request()
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci* crypto_finalize_akcipher_request()
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci* crypto_finalize_hash_request()
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci* crypto_finalize_kpp_request()
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci* crypto_finalize_skcipher_request()
87