1 /* SPDX-License-Identifier: GPL-2.0-or-later */
5 * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8 #ifndef _CRYPTO_INTERNAL_HASH_H
9 #define _CRYPTO_INTERNAL_HASH_H
11 #include <crypto/algapi.h>
12 #include <crypto/hash.h>
17 struct crypto_hash_walk
{
24 unsigned int entrylen
;
27 struct scatterlist
*sg
;
30 struct ahash_instance
{
31 void (*free
)(struct ahash_instance
*inst
);
34 char head
[offsetof(struct ahash_alg
, halg
.base
)];
35 struct crypto_instance base
;
41 struct shash_instance
{
42 void (*free
)(struct shash_instance
*inst
);
45 char head
[offsetof(struct shash_alg
, base
)];
46 struct crypto_instance base
;
52 struct crypto_ahash_spawn
{
53 struct crypto_spawn base
;
56 struct crypto_shash_spawn
{
57 struct crypto_spawn base
;
60 int crypto_hash_walk_done(struct crypto_hash_walk
*walk
, int err
);
61 int crypto_hash_walk_first(struct ahash_request
*req
,
62 struct crypto_hash_walk
*walk
);
64 static inline int crypto_hash_walk_last(struct crypto_hash_walk
*walk
)
66 return !(walk
->entrylen
| walk
->total
);
69 int crypto_register_ahash(struct ahash_alg
*alg
);
70 void crypto_unregister_ahash(struct ahash_alg
*alg
);
71 int crypto_register_ahashes(struct ahash_alg
*algs
, int count
);
72 void crypto_unregister_ahashes(struct ahash_alg
*algs
, int count
);
73 int ahash_register_instance(struct crypto_template
*tmpl
,
74 struct ahash_instance
*inst
);
76 int shash_no_setkey(struct crypto_shash
*tfm
, const u8
*key
,
79 static inline bool crypto_shash_alg_has_setkey(struct shash_alg
*alg
)
81 return alg
->setkey
!= shash_no_setkey
;
84 static inline bool crypto_shash_alg_needs_key(struct shash_alg
*alg
)
86 return crypto_shash_alg_has_setkey(alg
) &&
87 !(alg
->base
.cra_flags
& CRYPTO_ALG_OPTIONAL_KEY
);
90 int crypto_grab_ahash(struct crypto_ahash_spawn
*spawn
,
91 struct crypto_instance
*inst
,
92 const char *name
, u32 type
, u32 mask
);
94 static inline void crypto_drop_ahash(struct crypto_ahash_spawn
*spawn
)
96 crypto_drop_spawn(&spawn
->base
);
99 static inline struct hash_alg_common
*crypto_spawn_ahash_alg(
100 struct crypto_ahash_spawn
*spawn
)
102 return __crypto_hash_alg_common(spawn
->base
.alg
);
105 int crypto_register_shash(struct shash_alg
*alg
);
106 void crypto_unregister_shash(struct shash_alg
*alg
);
107 int crypto_register_shashes(struct shash_alg
*algs
, int count
);
108 void crypto_unregister_shashes(struct shash_alg
*algs
, int count
);
109 int shash_register_instance(struct crypto_template
*tmpl
,
110 struct shash_instance
*inst
);
111 void shash_free_singlespawn_instance(struct shash_instance
*inst
);
113 int crypto_grab_shash(struct crypto_shash_spawn
*spawn
,
114 struct crypto_instance
*inst
,
115 const char *name
, u32 type
, u32 mask
);
117 static inline void crypto_drop_shash(struct crypto_shash_spawn
*spawn
)
119 crypto_drop_spawn(&spawn
->base
);
122 static inline struct shash_alg
*crypto_spawn_shash_alg(
123 struct crypto_shash_spawn
*spawn
)
125 return __crypto_shash_alg(spawn
->base
.alg
);
128 int shash_ahash_update(struct ahash_request
*req
, struct shash_desc
*desc
);
129 int shash_ahash_finup(struct ahash_request
*req
, struct shash_desc
*desc
);
130 int shash_ahash_digest(struct ahash_request
*req
, struct shash_desc
*desc
);
132 static inline void *crypto_ahash_ctx(struct crypto_ahash
*tfm
)
134 return crypto_tfm_ctx(crypto_ahash_tfm(tfm
));
137 static inline void *crypto_ahash_ctx_dma(struct crypto_ahash
*tfm
)
139 return crypto_tfm_ctx_dma(crypto_ahash_tfm(tfm
));
142 static inline struct ahash_alg
*__crypto_ahash_alg(struct crypto_alg
*alg
)
144 return container_of(__crypto_hash_alg_common(alg
), struct ahash_alg
,
148 static inline struct ahash_alg
*crypto_ahash_alg(struct crypto_ahash
*hash
)
150 return container_of(crypto_hash_alg_common(hash
), struct ahash_alg
,
154 static inline void crypto_ahash_set_statesize(struct crypto_ahash
*tfm
,
157 tfm
->statesize
= size
;
160 static inline void crypto_ahash_set_reqsize(struct crypto_ahash
*tfm
,
161 unsigned int reqsize
)
163 tfm
->reqsize
= reqsize
;
166 static inline void crypto_ahash_set_reqsize_dma(struct crypto_ahash
*ahash
,
167 unsigned int reqsize
)
169 reqsize
+= crypto_dma_align() & ~(crypto_tfm_ctx_alignment() - 1);
170 ahash
->reqsize
= reqsize
;
173 static inline struct crypto_instance
*ahash_crypto_instance(
174 struct ahash_instance
*inst
)
176 return &inst
->s
.base
;
179 static inline struct ahash_instance
*ahash_instance(
180 struct crypto_instance
*inst
)
182 return container_of(inst
, struct ahash_instance
, s
.base
);
185 static inline struct ahash_instance
*ahash_alg_instance(
186 struct crypto_ahash
*ahash
)
188 return ahash_instance(crypto_tfm_alg_instance(&ahash
->base
));
191 static inline void *ahash_instance_ctx(struct ahash_instance
*inst
)
193 return crypto_instance_ctx(ahash_crypto_instance(inst
));
196 static inline void *ahash_request_ctx_dma(struct ahash_request
*req
)
198 unsigned int align
= crypto_dma_align();
200 if (align
<= crypto_tfm_ctx_alignment())
203 return PTR_ALIGN(ahash_request_ctx(req
), align
);
206 static inline void ahash_request_complete(struct ahash_request
*req
, int err
)
208 crypto_request_complete(&req
->base
, err
);
211 static inline u32
ahash_request_flags(struct ahash_request
*req
)
213 return req
->base
.flags
;
216 static inline struct crypto_ahash
*crypto_spawn_ahash(
217 struct crypto_ahash_spawn
*spawn
)
219 return crypto_spawn_tfm2(&spawn
->base
);
222 static inline int ahash_enqueue_request(struct crypto_queue
*queue
,
223 struct ahash_request
*request
)
225 return crypto_enqueue_request(queue
, &request
->base
);
228 static inline struct ahash_request
*ahash_dequeue_request(
229 struct crypto_queue
*queue
)
231 return ahash_request_cast(crypto_dequeue_request(queue
));
234 static inline void *crypto_shash_ctx(struct crypto_shash
*tfm
)
236 return crypto_tfm_ctx(&tfm
->base
);
239 static inline struct crypto_instance
*shash_crypto_instance(
240 struct shash_instance
*inst
)
242 return &inst
->s
.base
;
245 static inline struct shash_instance
*shash_instance(
246 struct crypto_instance
*inst
)
248 return container_of(inst
, struct shash_instance
, s
.base
);
251 static inline struct shash_instance
*shash_alg_instance(
252 struct crypto_shash
*shash
)
254 return shash_instance(crypto_tfm_alg_instance(&shash
->base
));
257 static inline void *shash_instance_ctx(struct shash_instance
*inst
)
259 return crypto_instance_ctx(shash_crypto_instance(inst
));
262 static inline struct crypto_shash
*crypto_spawn_shash(
263 struct crypto_shash_spawn
*spawn
)
265 return crypto_spawn_tfm2(&spawn
->base
);
268 static inline struct crypto_shash
*__crypto_shash_cast(struct crypto_tfm
*tfm
)
270 return container_of(tfm
, struct crypto_shash
, base
);
273 #endif /* _CRYPTO_INTERNAL_HASH_H */