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