1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Cryptographic API.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
6*4882a593Smuzhiyun * Copyright (c) 2005 Herbert Xu <herbert@gondor.apana.org.au>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun #ifndef _CRYPTO_INTERNAL_H
9*4882a593Smuzhiyun #define _CRYPTO_INTERNAL_H
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <crypto/algapi.h>
12*4882a593Smuzhiyun #include <linux/completion.h>
13*4882a593Smuzhiyun #include <linux/list.h>
14*4882a593Smuzhiyun #include <linux/module.h>
15*4882a593Smuzhiyun #include <linux/notifier.h>
16*4882a593Smuzhiyun #include <linux/numa.h>
17*4882a593Smuzhiyun #include <linux/refcount.h>
18*4882a593Smuzhiyun #include <linux/rwsem.h>
19*4882a593Smuzhiyun #include <linux/sched.h>
20*4882a593Smuzhiyun #include <linux/types.h>
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun struct crypto_instance;
23*4882a593Smuzhiyun struct crypto_template;
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun struct crypto_larval {
26*4882a593Smuzhiyun struct crypto_alg alg;
27*4882a593Smuzhiyun struct crypto_alg *adult;
28*4882a593Smuzhiyun struct completion completion;
29*4882a593Smuzhiyun u32 mask;
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun extern struct list_head crypto_alg_list;
33*4882a593Smuzhiyun extern struct rw_semaphore crypto_alg_sem;
34*4882a593Smuzhiyun extern struct blocking_notifier_head crypto_chain;
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
37*4882a593Smuzhiyun void __init crypto_init_proc(void);
38*4882a593Smuzhiyun void __exit crypto_exit_proc(void);
39*4882a593Smuzhiyun #else
crypto_init_proc(void)40*4882a593Smuzhiyun static inline void crypto_init_proc(void)
41*4882a593Smuzhiyun { }
crypto_exit_proc(void)42*4882a593Smuzhiyun static inline void crypto_exit_proc(void)
43*4882a593Smuzhiyun { }
44*4882a593Smuzhiyun #endif
45*4882a593Smuzhiyun
crypto_cipher_ctxsize(struct crypto_alg * alg)46*4882a593Smuzhiyun static inline unsigned int crypto_cipher_ctxsize(struct crypto_alg *alg)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun return alg->cra_ctxsize;
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun
crypto_compress_ctxsize(struct crypto_alg * alg)51*4882a593Smuzhiyun static inline unsigned int crypto_compress_ctxsize(struct crypto_alg *alg)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun return alg->cra_ctxsize;
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun struct crypto_alg *crypto_mod_get(struct crypto_alg *alg);
57*4882a593Smuzhiyun struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask);
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun struct crypto_larval *crypto_larval_alloc(const char *name, u32 type, u32 mask);
60*4882a593Smuzhiyun void crypto_larval_kill(struct crypto_alg *alg);
61*4882a593Smuzhiyun void crypto_alg_tested(const char *name, int err);
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun void crypto_remove_spawns(struct crypto_alg *alg, struct list_head *list,
64*4882a593Smuzhiyun struct crypto_alg *nalg);
65*4882a593Smuzhiyun void crypto_remove_final(struct list_head *list);
66*4882a593Smuzhiyun void crypto_shoot_alg(struct crypto_alg *alg);
67*4882a593Smuzhiyun struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type,
68*4882a593Smuzhiyun u32 mask);
69*4882a593Smuzhiyun void *crypto_create_tfm_node(struct crypto_alg *alg,
70*4882a593Smuzhiyun const struct crypto_type *frontend, int node);
71*4882a593Smuzhiyun
crypto_create_tfm(struct crypto_alg * alg,const struct crypto_type * frontend)72*4882a593Smuzhiyun static inline void *crypto_create_tfm(struct crypto_alg *alg,
73*4882a593Smuzhiyun const struct crypto_type *frontend)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun return crypto_create_tfm_node(alg, frontend, NUMA_NO_NODE);
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun struct crypto_alg *crypto_find_alg(const char *alg_name,
79*4882a593Smuzhiyun const struct crypto_type *frontend,
80*4882a593Smuzhiyun u32 type, u32 mask);
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun void *crypto_alloc_tfm_node(const char *alg_name,
83*4882a593Smuzhiyun const struct crypto_type *frontend, u32 type, u32 mask,
84*4882a593Smuzhiyun int node);
85*4882a593Smuzhiyun
crypto_alloc_tfm(const char * alg_name,const struct crypto_type * frontend,u32 type,u32 mask)86*4882a593Smuzhiyun static inline void *crypto_alloc_tfm(const char *alg_name,
87*4882a593Smuzhiyun const struct crypto_type *frontend, u32 type, u32 mask)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun return crypto_alloc_tfm_node(alg_name, frontend, type, mask, NUMA_NO_NODE);
90*4882a593Smuzhiyun }
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun int crypto_probing_notify(unsigned long val, void *v);
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun unsigned int crypto_alg_extsize(struct crypto_alg *alg);
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun int crypto_type_has_alg(const char *name, const struct crypto_type *frontend,
97*4882a593Smuzhiyun u32 type, u32 mask);
98*4882a593Smuzhiyun
crypto_alg_get(struct crypto_alg * alg)99*4882a593Smuzhiyun static inline struct crypto_alg *crypto_alg_get(struct crypto_alg *alg)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun refcount_inc(&alg->cra_refcnt);
102*4882a593Smuzhiyun return alg;
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun
crypto_alg_put(struct crypto_alg * alg)105*4882a593Smuzhiyun static inline void crypto_alg_put(struct crypto_alg *alg)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun if (refcount_dec_and_test(&alg->cra_refcnt) && alg->cra_destroy)
108*4882a593Smuzhiyun alg->cra_destroy(alg);
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun
crypto_tmpl_get(struct crypto_template * tmpl)111*4882a593Smuzhiyun static inline int crypto_tmpl_get(struct crypto_template *tmpl)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun return try_module_get(tmpl->module);
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun
crypto_tmpl_put(struct crypto_template * tmpl)116*4882a593Smuzhiyun static inline void crypto_tmpl_put(struct crypto_template *tmpl)
117*4882a593Smuzhiyun {
118*4882a593Smuzhiyun module_put(tmpl->module);
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun
crypto_is_larval(struct crypto_alg * alg)121*4882a593Smuzhiyun static inline int crypto_is_larval(struct crypto_alg *alg)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun return alg->cra_flags & CRYPTO_ALG_LARVAL;
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun
crypto_is_dead(struct crypto_alg * alg)126*4882a593Smuzhiyun static inline int crypto_is_dead(struct crypto_alg *alg)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun return alg->cra_flags & CRYPTO_ALG_DEAD;
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun
crypto_is_moribund(struct crypto_alg * alg)131*4882a593Smuzhiyun static inline int crypto_is_moribund(struct crypto_alg *alg)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun return alg->cra_flags & (CRYPTO_ALG_DEAD | CRYPTO_ALG_DYING);
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun
crypto_notify(unsigned long val,void * v)136*4882a593Smuzhiyun static inline void crypto_notify(unsigned long val, void *v)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun blocking_notifier_call_chain(&crypto_chain, val, v);
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun
crypto_yield(u32 flags)141*4882a593Smuzhiyun static inline void crypto_yield(u32 flags)
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun if (flags & CRYPTO_TFM_REQ_MAY_SLEEP)
144*4882a593Smuzhiyun cond_resched();
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun #endif /* _CRYPTO_INTERNAL_H */
148*4882a593Smuzhiyun
149