1 /* SPDX-License-Identifier: GPL-2.0-or-later * 1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 2 /* 3 * Crypto engine API 3 * Crypto engine API 4 * 4 * 5 * Copyright (c) 2016 Baolin Wang <baolin.wang 5 * Copyright (c) 2016 Baolin Wang <baolin.wang@linaro.org> 6 */ 6 */ 7 #ifndef _CRYPTO_ENGINE_H 7 #ifndef _CRYPTO_ENGINE_H 8 #define _CRYPTO_ENGINE_H 8 #define _CRYPTO_ENGINE_H 9 9 >> 10 #include <linux/crypto.h> >> 11 #include <linux/list.h> >> 12 #include <linux/kernel.h> >> 13 #include <linux/kthread.h> >> 14 #include <crypto/algapi.h> 10 #include <crypto/aead.h> 15 #include <crypto/aead.h> 11 #include <crypto/akcipher.h> 16 #include <crypto/akcipher.h> 12 #include <crypto/hash.h> 17 #include <crypto/hash.h> 13 #include <crypto/kpp.h> << 14 #include <crypto/skcipher.h> 18 #include <crypto/skcipher.h> 15 #include <linux/types.h> << 16 19 17 struct crypto_engine; !! 20 #define ENGINE_NAME_LEN 30 18 struct device; !! 21 /* >> 22 * struct crypto_engine - crypto hardware engine >> 23 * @name: the engine name >> 24 * @idling: the engine is entering idle state >> 25 * @busy: request pump is busy >> 26 * @running: the engine is on working >> 27 * @cur_req_prepared: current request is prepared >> 28 * @list: link with the global crypto engine list >> 29 * @queue_lock: spinlock to syncronise access to request queue >> 30 * @queue: the crypto queue of the engine >> 31 * @rt: whether this queue is set to run as a realtime task >> 32 * @prepare_crypt_hardware: a request will soon arrive from the queue >> 33 * so the subsystem requests the driver to prepare the hardware >> 34 * by issuing this call >> 35 * @unprepare_crypt_hardware: there are currently no more requests on the >> 36 * queue so the subsystem notifies the driver that it may relax the >> 37 * hardware by issuing this call >> 38 * @kworker: kthread worker struct for request pump >> 39 * @pump_requests: work struct for scheduling work to the request pump >> 40 * @priv_data: the engine private data >> 41 * @cur_req: the current request which is on processing >> 42 */ >> 43 struct crypto_engine { >> 44 char name[ENGINE_NAME_LEN]; >> 45 bool idling; >> 46 bool busy; >> 47 bool running; >> 48 bool cur_req_prepared; >> 49 >> 50 struct list_head list; >> 51 spinlock_t queue_lock; >> 52 struct crypto_queue queue; >> 53 struct device *dev; >> 54 >> 55 bool rt; >> 56 >> 57 int (*prepare_crypt_hardware)(struct crypto_engine *engine); >> 58 int (*unprepare_crypt_hardware)(struct crypto_engine *engine); >> 59 >> 60 struct kthread_worker *kworker; >> 61 struct kthread_work pump_requests; >> 62 >> 63 void *priv_data; >> 64 struct crypto_async_request *cur_req; >> 65 }; 19 66 20 /* 67 /* 21 * struct crypto_engine_op - crypto hardware e 68 * struct crypto_engine_op - crypto hardware engine operations >> 69 * @prepare__request: do some prepare if need before handle the current request >> 70 * @unprepare_request: undo any work done by prepare_request() 22 * @do_one_request: do encryption for current 71 * @do_one_request: do encryption for current request 23 */ 72 */ 24 struct crypto_engine_op { 73 struct crypto_engine_op { >> 74 int (*prepare_request)(struct crypto_engine *engine, >> 75 void *areq); >> 76 int (*unprepare_request)(struct crypto_engine *engine, >> 77 void *areq); 25 int (*do_one_request)(struct crypto_en 78 int (*do_one_request)(struct crypto_engine *engine, 26 void *areq); 79 void *areq); 27 }; 80 }; 28 81 29 struct aead_engine_alg { !! 82 struct crypto_engine_ctx { 30 struct aead_alg base; << 31 struct crypto_engine_op op; << 32 }; << 33 << 34 struct ahash_engine_alg { << 35 struct ahash_alg base; << 36 struct crypto_engine_op op; << 37 }; << 38 << 39 struct akcipher_engine_alg { << 40 struct akcipher_alg base; << 41 struct crypto_engine_op op; << 42 }; << 43 << 44 struct kpp_engine_alg { << 45 struct kpp_alg base; << 46 struct crypto_engine_op op; << 47 }; << 48 << 49 struct skcipher_engine_alg { << 50 struct skcipher_alg base; << 51 struct crypto_engine_op op; 83 struct crypto_engine_op op; 52 }; 84 }; 53 85 54 int crypto_transfer_aead_request_to_engine(str 86 int crypto_transfer_aead_request_to_engine(struct crypto_engine *engine, 55 str 87 struct aead_request *req); 56 int crypto_transfer_akcipher_request_to_engine 88 int crypto_transfer_akcipher_request_to_engine(struct crypto_engine *engine, 57 89 struct akcipher_request *req); 58 int crypto_transfer_hash_request_to_engine(str 90 int crypto_transfer_hash_request_to_engine(struct crypto_engine *engine, 59 91 struct ahash_request *req); 60 int crypto_transfer_kpp_request_to_engine(stru << 61 stru << 62 int crypto_transfer_skcipher_request_to_engine 92 int crypto_transfer_skcipher_request_to_engine(struct crypto_engine *engine, 63 93 struct skcipher_request *req); 64 void crypto_finalize_aead_request(struct crypt 94 void crypto_finalize_aead_request(struct crypto_engine *engine, 65 struct aead_ 95 struct aead_request *req, int err); 66 void crypto_finalize_akcipher_request(struct c 96 void crypto_finalize_akcipher_request(struct crypto_engine *engine, 67 struct a 97 struct akcipher_request *req, int err); 68 void crypto_finalize_hash_request(struct crypt 98 void crypto_finalize_hash_request(struct crypto_engine *engine, 69 struct ahash 99 struct ahash_request *req, int err); 70 void crypto_finalize_kpp_request(struct crypto << 71 struct kpp_re << 72 void crypto_finalize_skcipher_request(struct c 100 void crypto_finalize_skcipher_request(struct crypto_engine *engine, 73 struct s 101 struct skcipher_request *req, int err); 74 int crypto_engine_start(struct crypto_engine * 102 int crypto_engine_start(struct crypto_engine *engine); 75 int crypto_engine_stop(struct crypto_engine *e 103 int crypto_engine_stop(struct crypto_engine *engine); 76 struct crypto_engine *crypto_engine_alloc_init 104 struct crypto_engine *crypto_engine_alloc_init(struct device *dev, bool rt); 77 struct crypto_engine *crypto_engine_alloc_init !! 105 int crypto_engine_exit(struct crypto_engine *engine); 78 << 79 << 80 << 81 void crypto_engine_exit(struct crypto_engine * << 82 << 83 int crypto_engine_register_aead(struct aead_en << 84 void crypto_engine_unregister_aead(struct aead << 85 int crypto_engine_register_aeads(struct aead_e << 86 void crypto_engine_unregister_aeads(struct aea << 87 << 88 int crypto_engine_register_ahash(struct ahash_ << 89 void crypto_engine_unregister_ahash(struct aha << 90 int crypto_engine_register_ahashes(struct ahas << 91 void crypto_engine_unregister_ahashes(struct a << 92 int coun << 93 << 94 int crypto_engine_register_akcipher(struct akc << 95 void crypto_engine_unregister_akcipher(struct << 96 << 97 int crypto_engine_register_kpp(struct kpp_engi << 98 void crypto_engine_unregister_kpp(struct kpp_e << 99 << 100 int crypto_engine_register_skcipher(struct skc << 101 void crypto_engine_unregister_skcipher(struct << 102 int crypto_engine_register_skciphers(struct sk << 103 int count << 104 void crypto_engine_unregister_skciphers(struct << 105 int co << 106 106 107 #endif /* _CRYPTO_ENGINE_H */ 107 #endif /* _CRYPTO_ENGINE_H */ 108 108
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.