1 /* SPDX-License-Identifier: GPL-2.0-or-later * << 2 /* 1 /* 3 * Crypto engine API 2 * Crypto engine API 4 * 3 * 5 * Copyright (c) 2016 Baolin Wang <baolin.wang 4 * Copyright (c) 2016 Baolin Wang <baolin.wang@linaro.org> >> 5 * >> 6 * This program is free software; you can redistribute it and/or modify it >> 7 * under the terms of the GNU General Public License as published by the Free >> 8 * Software Foundation; either version 2 of the License, or (at your option) >> 9 * any later version. >> 10 * 6 */ 11 */ 7 #ifndef _CRYPTO_ENGINE_H 12 #ifndef _CRYPTO_ENGINE_H 8 #define _CRYPTO_ENGINE_H 13 #define _CRYPTO_ENGINE_H 9 14 >> 15 #include <linux/crypto.h> >> 16 #include <linux/list.h> >> 17 #include <linux/kernel.h> >> 18 #include <linux/kthread.h> >> 19 #include <crypto/algapi.h> 10 #include <crypto/aead.h> 20 #include <crypto/aead.h> 11 #include <crypto/akcipher.h> 21 #include <crypto/akcipher.h> 12 #include <crypto/hash.h> 22 #include <crypto/hash.h> 13 #include <crypto/kpp.h> << 14 #include <crypto/skcipher.h> 23 #include <crypto/skcipher.h> 15 #include <linux/types.h> << 16 24 17 struct crypto_engine; !! 25 #define ENGINE_NAME_LEN 30 18 struct device; !! 26 /* >> 27 * struct crypto_engine - crypto hardware engine >> 28 * @name: the engine name >> 29 * @idling: the engine is entering idle state >> 30 * @busy: request pump is busy >> 31 * @running: the engine is on working >> 32 * @cur_req_prepared: current request is prepared >> 33 * @list: link with the global crypto engine list >> 34 * @queue_lock: spinlock to syncronise access to request queue >> 35 * @queue: the crypto queue of the engine >> 36 * @rt: whether this queue is set to run as a realtime task >> 37 * @prepare_crypt_hardware: a request will soon arrive from the queue >> 38 * so the subsystem requests the driver to prepare the hardware >> 39 * by issuing this call >> 40 * @unprepare_crypt_hardware: there are currently no more requests on the >> 41 * queue so the subsystem notifies the driver that it may relax the >> 42 * hardware by issuing this call >> 43 * @kworker: kthread worker struct for request pump >> 44 * @pump_requests: work struct for scheduling work to the request pump >> 45 * @priv_data: the engine private data >> 46 * @cur_req: the current request which is on processing >> 47 */ >> 48 struct crypto_engine { >> 49 char name[ENGINE_NAME_LEN]; >> 50 bool idling; >> 51 bool busy; >> 52 bool running; >> 53 bool cur_req_prepared; >> 54 >> 55 struct list_head list; >> 56 spinlock_t queue_lock; >> 57 struct crypto_queue queue; >> 58 struct device *dev; >> 59 >> 60 bool rt; >> 61 >> 62 int (*prepare_crypt_hardware)(struct crypto_engine *engine); >> 63 int (*unprepare_crypt_hardware)(struct crypto_engine *engine); >> 64 >> 65 struct kthread_worker *kworker; >> 66 struct kthread_work pump_requests; >> 67 >> 68 void *priv_data; >> 69 struct crypto_async_request *cur_req; >> 70 }; 19 71 20 /* 72 /* 21 * struct crypto_engine_op - crypto hardware e 73 * struct crypto_engine_op - crypto hardware engine operations >> 74 * @prepare__request: do some prepare if need before handle the current request >> 75 * @unprepare_request: undo any work done by prepare_request() 22 * @do_one_request: do encryption for current 76 * @do_one_request: do encryption for current request 23 */ 77 */ 24 struct crypto_engine_op { 78 struct crypto_engine_op { >> 79 int (*prepare_request)(struct crypto_engine *engine, >> 80 void *areq); >> 81 int (*unprepare_request)(struct crypto_engine *engine, >> 82 void *areq); 25 int (*do_one_request)(struct crypto_en 83 int (*do_one_request)(struct crypto_engine *engine, 26 void *areq); 84 void *areq); 27 }; 85 }; 28 86 29 struct aead_engine_alg { !! 87 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; 88 struct crypto_engine_op op; 52 }; 89 }; 53 90 >> 91 int crypto_transfer_ablkcipher_request_to_engine(struct crypto_engine *engine, >> 92 struct ablkcipher_request *req); 54 int crypto_transfer_aead_request_to_engine(str 93 int crypto_transfer_aead_request_to_engine(struct crypto_engine *engine, 55 str 94 struct aead_request *req); 56 int crypto_transfer_akcipher_request_to_engine 95 int crypto_transfer_akcipher_request_to_engine(struct crypto_engine *engine, 57 96 struct akcipher_request *req); 58 int crypto_transfer_hash_request_to_engine(str 97 int crypto_transfer_hash_request_to_engine(struct crypto_engine *engine, 59 98 struct ahash_request *req); 60 int crypto_transfer_kpp_request_to_engine(stru << 61 stru << 62 int crypto_transfer_skcipher_request_to_engine 99 int crypto_transfer_skcipher_request_to_engine(struct crypto_engine *engine, 63 100 struct skcipher_request *req); >> 101 void crypto_finalize_ablkcipher_request(struct crypto_engine *engine, >> 102 struct ablkcipher_request *req, int err); 64 void crypto_finalize_aead_request(struct crypt 103 void crypto_finalize_aead_request(struct crypto_engine *engine, 65 struct aead_ 104 struct aead_request *req, int err); 66 void crypto_finalize_akcipher_request(struct c 105 void crypto_finalize_akcipher_request(struct crypto_engine *engine, 67 struct a 106 struct akcipher_request *req, int err); 68 void crypto_finalize_hash_request(struct crypt 107 void crypto_finalize_hash_request(struct crypto_engine *engine, 69 struct ahash 108 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 109 void crypto_finalize_skcipher_request(struct crypto_engine *engine, 73 struct s 110 struct skcipher_request *req, int err); 74 int crypto_engine_start(struct crypto_engine * 111 int crypto_engine_start(struct crypto_engine *engine); 75 int crypto_engine_stop(struct crypto_engine *e 112 int crypto_engine_stop(struct crypto_engine *engine); 76 struct crypto_engine *crypto_engine_alloc_init 113 struct crypto_engine *crypto_engine_alloc_init(struct device *dev, bool rt); 77 struct crypto_engine *crypto_engine_alloc_init !! 114 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 115 107 #endif /* _CRYPTO_ENGINE_H */ 116 #endif /* _CRYPTO_ENGINE_H */ 108 117
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.