| .. SPDX-License-Identifier: GPL-2.0 | |
| Crypto Engine | |
| ============= | |
| Overview | |
| -------- | |
| The crypto engine (CE) API is a crypto queue manager. | |
| Requirement | |
| ----------- | |
| You must put, at the start of your transform context your_tfm_ctx, the structure | |
| crypto_engine: | |
| :: | |
| struct your_tfm_ctx { | |
| struct crypto_engine engine; | |
| ... | |
| }; | |
| The crypto engine only manages asynchronous requests in the form of | |
| crypto_async_request. It cannot know the underlying request type and thus only | |
| has access to the transform structure. It is not possible to access the context | |
| using container_of. In addition, the engine knows nothing about your | |
| structure "``struct your_tfm_ctx``". The engine assumes (requires) the placement | |
| of the known member ``struct crypto_engine`` at the beginning. | |
| Order of operations | |
| ------------------- | |
| You are required to obtain a struct crypto_engine via ``crypto_engine_alloc_init()``. | |
| Start it via ``crypto_engine_start()``. When finished with your work, shut down the | |
| engine using ``crypto_engine_stop()`` and destroy the engine with | |
| ``crypto_engine_exit()``. | |
| Before transferring any request, you have to fill the context enginectx by | |
| providing functions for the following: | |
| * ``prepare_crypt_hardware``: Called once before any prepare functions are | |
| called. | |
| * ``unprepare_crypt_hardware``: Called once after all unprepare functions have | |
| been called. | |
| * ``prepare_cipher_request``/``prepare_hash_request``: Called before each | |
| corresponding request is performed. If some processing or other preparatory | |
| work is required, do it here. | |
| * ``unprepare_cipher_request``/``unprepare_hash_request``: Called after each | |
| request is handled. Clean up / undo what was done in the prepare function. | |
| * ``cipher_one_request``/``hash_one_request``: Handle the current request by | |
| performing the operation. | |
| Note that these functions access the crypto_async_request structure | |
| associated with the received request. You are able to retrieve the original | |
| request by using: | |
| :: | |
| container_of(areq, struct yourrequesttype_request, base); | |
| When your driver receives a crypto_request, you must to transfer it to | |
| the crypto engine via one of: | |
| * crypto_transfer_ablkcipher_request_to_engine() | |
| * crypto_transfer_aead_request_to_engine() | |
| * crypto_transfer_akcipher_request_to_engine() | |
| * crypto_transfer_hash_request_to_engine() | |
| * crypto_transfer_skcipher_request_to_engine() | |
| At the end of the request process, a call to one of the following functions is needed: | |
| * crypto_finalize_ablkcipher_request() | |
| * crypto_finalize_aead_request() | |
| * crypto_finalize_akcipher_request() | |
| * crypto_finalize_hash_request() | |
| * crypto_finalize_skcipher_request() |