223 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * Cryptographic API.4 *5 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>6 * Copyright (c) 2005 Herbert Xu <herbert@gondor.apana.org.au>7 */8#ifndef _CRYPTO_INTERNAL_H9#define _CRYPTO_INTERNAL_H10 11#include <crypto/algapi.h>12#include <linux/completion.h>13#include <linux/err.h>14#include <linux/jump_label.h>15#include <linux/list.h>16#include <linux/module.h>17#include <linux/notifier.h>18#include <linux/numa.h>19#include <linux/refcount.h>20#include <linux/rwsem.h>21#include <linux/scatterlist.h>22#include <linux/sched.h>23#include <linux/types.h>24 25struct akcipher_request;26struct crypto_akcipher;27struct crypto_instance;28struct crypto_template;29 30struct crypto_larval {31 struct crypto_alg alg;32 struct crypto_alg *adult;33 struct completion completion;34 u32 mask;35 bool test_started;36};37 38struct crypto_akcipher_sync_data {39 struct crypto_akcipher *tfm;40 const void *src;41 void *dst;42 unsigned int slen;43 unsigned int dlen;44 45 struct akcipher_request *req;46 struct crypto_wait cwait;47 struct scatterlist sg;48 u8 *buf;49};50 51enum {52 CRYPTOA_UNSPEC,53 CRYPTOA_ALG,54 CRYPTOA_TYPE,55 __CRYPTOA_MAX,56};57 58#define CRYPTOA_MAX (__CRYPTOA_MAX - 1)59 60/* Maximum number of (rtattr) parameters for each template. */61#define CRYPTO_MAX_ATTRS 3262 63extern struct list_head crypto_alg_list;64extern struct rw_semaphore crypto_alg_sem;65extern struct blocking_notifier_head crypto_chain;66 67int alg_test(const char *driver, const char *alg, u32 type, u32 mask);68 69#if !IS_BUILTIN(CONFIG_CRYPTO_ALGAPI) || \70 IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS)71static inline bool crypto_boot_test_finished(void)72{73 return true;74}75static inline void set_crypto_boot_test_finished(void)76{77}78#else79DECLARE_STATIC_KEY_FALSE(__crypto_boot_test_finished);80static inline bool crypto_boot_test_finished(void)81{82 return static_branch_likely(&__crypto_boot_test_finished);83}84static inline void set_crypto_boot_test_finished(void)85{86 static_branch_enable(&__crypto_boot_test_finished);87}88#endif /* !IS_BUILTIN(CONFIG_CRYPTO_ALGAPI) ||89 * IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS)90 */91 92#ifdef CONFIG_PROC_FS93void __init crypto_init_proc(void);94void __exit crypto_exit_proc(void);95#else96static inline void crypto_init_proc(void)97{ }98static inline void crypto_exit_proc(void)99{ }100#endif101 102static inline unsigned int crypto_cipher_ctxsize(struct crypto_alg *alg)103{104 return alg->cra_ctxsize;105}106 107static inline unsigned int crypto_compress_ctxsize(struct crypto_alg *alg)108{109 return alg->cra_ctxsize;110}111 112struct crypto_alg *crypto_mod_get(struct crypto_alg *alg);113struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask);114 115struct crypto_larval *crypto_larval_alloc(const char *name, u32 type, u32 mask);116void crypto_schedule_test(struct crypto_larval *larval);117void crypto_alg_tested(const char *name, int err);118 119void crypto_remove_spawns(struct crypto_alg *alg, struct list_head *list,120 struct crypto_alg *nalg);121void crypto_remove_final(struct list_head *list);122void crypto_shoot_alg(struct crypto_alg *alg);123struct crypto_tfm *__crypto_alloc_tfmgfp(struct crypto_alg *alg, u32 type,124 u32 mask, gfp_t gfp);125struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type,126 u32 mask);127void *crypto_create_tfm_node(struct crypto_alg *alg,128 const struct crypto_type *frontend, int node);129void *crypto_clone_tfm(const struct crypto_type *frontend,130 struct crypto_tfm *otfm);131 132int crypto_akcipher_sync_prep(struct crypto_akcipher_sync_data *data);133int crypto_akcipher_sync_post(struct crypto_akcipher_sync_data *data, int err);134int crypto_init_akcipher_ops_sig(struct crypto_tfm *tfm);135 136static inline void *crypto_create_tfm(struct crypto_alg *alg,137 const struct crypto_type *frontend)138{139 return crypto_create_tfm_node(alg, frontend, NUMA_NO_NODE);140}141 142struct crypto_alg *crypto_find_alg(const char *alg_name,143 const struct crypto_type *frontend,144 u32 type, u32 mask);145 146void *crypto_alloc_tfm_node(const char *alg_name,147 const struct crypto_type *frontend, u32 type, u32 mask,148 int node);149 150static inline void *crypto_alloc_tfm(const char *alg_name,151 const struct crypto_type *frontend, u32 type, u32 mask)152{153 return crypto_alloc_tfm_node(alg_name, frontend, type, mask, NUMA_NO_NODE);154}155 156int crypto_probing_notify(unsigned long val, void *v);157 158unsigned int crypto_alg_extsize(struct crypto_alg *alg);159 160int crypto_type_has_alg(const char *name, const struct crypto_type *frontend,161 u32 type, u32 mask);162 163static inline struct crypto_alg *crypto_alg_get(struct crypto_alg *alg)164{165 refcount_inc(&alg->cra_refcnt);166 return alg;167}168 169static inline void crypto_alg_put(struct crypto_alg *alg)170{171 if (refcount_dec_and_test(&alg->cra_refcnt) && alg->cra_destroy)172 alg->cra_destroy(alg);173}174 175static inline int crypto_tmpl_get(struct crypto_template *tmpl)176{177 return try_module_get(tmpl->module);178}179 180static inline void crypto_tmpl_put(struct crypto_template *tmpl)181{182 module_put(tmpl->module);183}184 185static inline int crypto_is_larval(struct crypto_alg *alg)186{187 return alg->cra_flags & CRYPTO_ALG_LARVAL;188}189 190static inline int crypto_is_dead(struct crypto_alg *alg)191{192 return alg->cra_flags & CRYPTO_ALG_DEAD;193}194 195static inline int crypto_is_moribund(struct crypto_alg *alg)196{197 return alg->cra_flags & (CRYPTO_ALG_DEAD | CRYPTO_ALG_DYING);198}199 200static inline void crypto_notify(unsigned long val, void *v)201{202 blocking_notifier_call_chain(&crypto_chain, val, v);203}204 205static inline void crypto_yield(u32 flags)206{207 if (flags & CRYPTO_TFM_REQ_MAY_SLEEP)208 cond_resched();209}210 211static inline int crypto_is_test_larval(struct crypto_larval *larval)212{213 return larval->alg.cra_driver_name[0];214}215 216static inline struct crypto_tfm *crypto_tfm_get(struct crypto_tfm *tfm)217{218 return refcount_inc_not_zero(&tfm->refcnt) ? tfm : ERR_PTR(-EOVERFLOW);219}220 221#endif /* _CRYPTO_INTERNAL_H */222 223