xref: /OK3568_Linux_fs/kernel/include/crypto/internal/hash.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Hash algorithms.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef _CRYPTO_INTERNAL_HASH_H
9*4882a593Smuzhiyun #define _CRYPTO_INTERNAL_HASH_H
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <crypto/algapi.h>
12*4882a593Smuzhiyun #include <crypto/hash.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun struct ahash_request;
15*4882a593Smuzhiyun struct scatterlist;
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun struct crypto_hash_walk {
18*4882a593Smuzhiyun 	char *data;
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun 	unsigned int offset;
21*4882a593Smuzhiyun 	unsigned int alignmask;
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun 	struct page *pg;
24*4882a593Smuzhiyun 	unsigned int entrylen;
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun 	unsigned int total;
27*4882a593Smuzhiyun 	struct scatterlist *sg;
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	unsigned int flags;
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun struct ahash_instance {
33*4882a593Smuzhiyun 	void (*free)(struct ahash_instance *inst);
34*4882a593Smuzhiyun 	union {
35*4882a593Smuzhiyun 		struct {
36*4882a593Smuzhiyun 			char head[offsetof(struct ahash_alg, halg.base)];
37*4882a593Smuzhiyun 			struct crypto_instance base;
38*4882a593Smuzhiyun 		} s;
39*4882a593Smuzhiyun 		struct ahash_alg alg;
40*4882a593Smuzhiyun 	};
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun struct shash_instance {
44*4882a593Smuzhiyun 	void (*free)(struct shash_instance *inst);
45*4882a593Smuzhiyun 	union {
46*4882a593Smuzhiyun 		struct {
47*4882a593Smuzhiyun 			char head[offsetof(struct shash_alg, base)];
48*4882a593Smuzhiyun 			struct crypto_instance base;
49*4882a593Smuzhiyun 		} s;
50*4882a593Smuzhiyun 		struct shash_alg alg;
51*4882a593Smuzhiyun 	};
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun struct crypto_ahash_spawn {
55*4882a593Smuzhiyun 	struct crypto_spawn base;
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun struct crypto_shash_spawn {
59*4882a593Smuzhiyun 	struct crypto_spawn base;
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun int crypto_hash_walk_done(struct crypto_hash_walk *walk, int err);
63*4882a593Smuzhiyun int crypto_hash_walk_first(struct ahash_request *req,
64*4882a593Smuzhiyun 			   struct crypto_hash_walk *walk);
65*4882a593Smuzhiyun 
crypto_hash_walk_last(struct crypto_hash_walk * walk)66*4882a593Smuzhiyun static inline int crypto_hash_walk_last(struct crypto_hash_walk *walk)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun 	return !(walk->entrylen | walk->total);
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun int crypto_register_ahash(struct ahash_alg *alg);
72*4882a593Smuzhiyun void crypto_unregister_ahash(struct ahash_alg *alg);
73*4882a593Smuzhiyun int crypto_register_ahashes(struct ahash_alg *algs, int count);
74*4882a593Smuzhiyun void crypto_unregister_ahashes(struct ahash_alg *algs, int count);
75*4882a593Smuzhiyun int ahash_register_instance(struct crypto_template *tmpl,
76*4882a593Smuzhiyun 			    struct ahash_instance *inst);
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun bool crypto_shash_alg_has_setkey(struct shash_alg *alg);
79*4882a593Smuzhiyun 
crypto_shash_alg_needs_key(struct shash_alg * alg)80*4882a593Smuzhiyun static inline bool crypto_shash_alg_needs_key(struct shash_alg *alg)
81*4882a593Smuzhiyun {
82*4882a593Smuzhiyun 	return crypto_shash_alg_has_setkey(alg) &&
83*4882a593Smuzhiyun 		!(alg->base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY);
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun bool crypto_hash_alg_has_setkey(struct hash_alg_common *halg);
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun int crypto_grab_ahash(struct crypto_ahash_spawn *spawn,
89*4882a593Smuzhiyun 		      struct crypto_instance *inst,
90*4882a593Smuzhiyun 		      const char *name, u32 type, u32 mask);
91*4882a593Smuzhiyun 
crypto_drop_ahash(struct crypto_ahash_spawn * spawn)92*4882a593Smuzhiyun static inline void crypto_drop_ahash(struct crypto_ahash_spawn *spawn)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	crypto_drop_spawn(&spawn->base);
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun 
crypto_spawn_ahash_alg(struct crypto_ahash_spawn * spawn)97*4882a593Smuzhiyun static inline struct hash_alg_common *crypto_spawn_ahash_alg(
98*4882a593Smuzhiyun 	struct crypto_ahash_spawn *spawn)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun 	return __crypto_hash_alg_common(spawn->base.alg);
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun int crypto_register_shash(struct shash_alg *alg);
104*4882a593Smuzhiyun void crypto_unregister_shash(struct shash_alg *alg);
105*4882a593Smuzhiyun int crypto_register_shashes(struct shash_alg *algs, int count);
106*4882a593Smuzhiyun void crypto_unregister_shashes(struct shash_alg *algs, int count);
107*4882a593Smuzhiyun int shash_register_instance(struct crypto_template *tmpl,
108*4882a593Smuzhiyun 			    struct shash_instance *inst);
109*4882a593Smuzhiyun void shash_free_singlespawn_instance(struct shash_instance *inst);
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun int crypto_grab_shash(struct crypto_shash_spawn *spawn,
112*4882a593Smuzhiyun 		      struct crypto_instance *inst,
113*4882a593Smuzhiyun 		      const char *name, u32 type, u32 mask);
114*4882a593Smuzhiyun 
crypto_drop_shash(struct crypto_shash_spawn * spawn)115*4882a593Smuzhiyun static inline void crypto_drop_shash(struct crypto_shash_spawn *spawn)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun 	crypto_drop_spawn(&spawn->base);
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun 
crypto_spawn_shash_alg(struct crypto_shash_spawn * spawn)120*4882a593Smuzhiyun static inline struct shash_alg *crypto_spawn_shash_alg(
121*4882a593Smuzhiyun 	struct crypto_shash_spawn *spawn)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun 	return __crypto_shash_alg(spawn->base.alg);
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun int shash_ahash_update(struct ahash_request *req, struct shash_desc *desc);
127*4882a593Smuzhiyun int shash_ahash_finup(struct ahash_request *req, struct shash_desc *desc);
128*4882a593Smuzhiyun int shash_ahash_digest(struct ahash_request *req, struct shash_desc *desc);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun int crypto_init_shash_ops_async(struct crypto_tfm *tfm);
131*4882a593Smuzhiyun 
crypto_ahash_ctx(struct crypto_ahash * tfm)132*4882a593Smuzhiyun static inline void *crypto_ahash_ctx(struct crypto_ahash *tfm)
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun 	return crypto_tfm_ctx(crypto_ahash_tfm(tfm));
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun 
__crypto_ahash_alg(struct crypto_alg * alg)137*4882a593Smuzhiyun static inline struct ahash_alg *__crypto_ahash_alg(struct crypto_alg *alg)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun 	return container_of(__crypto_hash_alg_common(alg), struct ahash_alg,
140*4882a593Smuzhiyun 			    halg);
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun 
crypto_ahash_set_reqsize(struct crypto_ahash * tfm,unsigned int reqsize)143*4882a593Smuzhiyun static inline void crypto_ahash_set_reqsize(struct crypto_ahash *tfm,
144*4882a593Smuzhiyun 					    unsigned int reqsize)
145*4882a593Smuzhiyun {
146*4882a593Smuzhiyun 	tfm->reqsize = reqsize;
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun 
ahash_crypto_instance(struct ahash_instance * inst)149*4882a593Smuzhiyun static inline struct crypto_instance *ahash_crypto_instance(
150*4882a593Smuzhiyun 	struct ahash_instance *inst)
151*4882a593Smuzhiyun {
152*4882a593Smuzhiyun 	return &inst->s.base;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun 
ahash_instance(struct crypto_instance * inst)155*4882a593Smuzhiyun static inline struct ahash_instance *ahash_instance(
156*4882a593Smuzhiyun 	struct crypto_instance *inst)
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun 	return container_of(inst, struct ahash_instance, s.base);
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun 
ahash_alg_instance(struct crypto_ahash * ahash)161*4882a593Smuzhiyun static inline struct ahash_instance *ahash_alg_instance(
162*4882a593Smuzhiyun 	struct crypto_ahash *ahash)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun 	return ahash_instance(crypto_tfm_alg_instance(&ahash->base));
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
ahash_instance_ctx(struct ahash_instance * inst)167*4882a593Smuzhiyun static inline void *ahash_instance_ctx(struct ahash_instance *inst)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun 	return crypto_instance_ctx(ahash_crypto_instance(inst));
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun 
ahash_request_complete(struct ahash_request * req,int err)172*4882a593Smuzhiyun static inline void ahash_request_complete(struct ahash_request *req, int err)
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun 	req->base.complete(&req->base, err);
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun 
ahash_request_flags(struct ahash_request * req)177*4882a593Smuzhiyun static inline u32 ahash_request_flags(struct ahash_request *req)
178*4882a593Smuzhiyun {
179*4882a593Smuzhiyun 	return req->base.flags;
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun 
crypto_spawn_ahash(struct crypto_ahash_spawn * spawn)182*4882a593Smuzhiyun static inline struct crypto_ahash *crypto_spawn_ahash(
183*4882a593Smuzhiyun 	struct crypto_ahash_spawn *spawn)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun 	return crypto_spawn_tfm2(&spawn->base);
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun 
ahash_enqueue_request(struct crypto_queue * queue,struct ahash_request * request)188*4882a593Smuzhiyun static inline int ahash_enqueue_request(struct crypto_queue *queue,
189*4882a593Smuzhiyun 					     struct ahash_request *request)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun 	return crypto_enqueue_request(queue, &request->base);
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun 
ahash_dequeue_request(struct crypto_queue * queue)194*4882a593Smuzhiyun static inline struct ahash_request *ahash_dequeue_request(
195*4882a593Smuzhiyun 	struct crypto_queue *queue)
196*4882a593Smuzhiyun {
197*4882a593Smuzhiyun 	return ahash_request_cast(crypto_dequeue_request(queue));
198*4882a593Smuzhiyun }
199*4882a593Smuzhiyun 
crypto_shash_ctx(struct crypto_shash * tfm)200*4882a593Smuzhiyun static inline void *crypto_shash_ctx(struct crypto_shash *tfm)
201*4882a593Smuzhiyun {
202*4882a593Smuzhiyun 	return crypto_tfm_ctx(&tfm->base);
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun 
shash_crypto_instance(struct shash_instance * inst)205*4882a593Smuzhiyun static inline struct crypto_instance *shash_crypto_instance(
206*4882a593Smuzhiyun 	struct shash_instance *inst)
207*4882a593Smuzhiyun {
208*4882a593Smuzhiyun 	return &inst->s.base;
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun 
shash_instance(struct crypto_instance * inst)211*4882a593Smuzhiyun static inline struct shash_instance *shash_instance(
212*4882a593Smuzhiyun 	struct crypto_instance *inst)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun 	return container_of(inst, struct shash_instance, s.base);
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun 
shash_alg_instance(struct crypto_shash * shash)217*4882a593Smuzhiyun static inline struct shash_instance *shash_alg_instance(
218*4882a593Smuzhiyun 	struct crypto_shash *shash)
219*4882a593Smuzhiyun {
220*4882a593Smuzhiyun 	return shash_instance(crypto_tfm_alg_instance(&shash->base));
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun 
shash_instance_ctx(struct shash_instance * inst)223*4882a593Smuzhiyun static inline void *shash_instance_ctx(struct shash_instance *inst)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun 	return crypto_instance_ctx(shash_crypto_instance(inst));
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun 
crypto_spawn_shash(struct crypto_shash_spawn * spawn)228*4882a593Smuzhiyun static inline struct crypto_shash *crypto_spawn_shash(
229*4882a593Smuzhiyun 	struct crypto_shash_spawn *spawn)
230*4882a593Smuzhiyun {
231*4882a593Smuzhiyun 	return crypto_spawn_tfm2(&spawn->base);
232*4882a593Smuzhiyun }
233*4882a593Smuzhiyun 
crypto_shash_ctx_aligned(struct crypto_shash * tfm)234*4882a593Smuzhiyun static inline void *crypto_shash_ctx_aligned(struct crypto_shash *tfm)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun 	return crypto_tfm_ctx_aligned(&tfm->base);
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun 
__crypto_shash_cast(struct crypto_tfm * tfm)239*4882a593Smuzhiyun static inline struct crypto_shash *__crypto_shash_cast(struct crypto_tfm *tfm)
240*4882a593Smuzhiyun {
241*4882a593Smuzhiyun 	return container_of(tfm, struct crypto_shash, base);
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun #endif	/* _CRYPTO_INTERNAL_HASH_H */
245*4882a593Smuzhiyun 
246