crypto: shash - remove support for nonzero alignmask
[linux-2.6-block.git] / crypto / shash.c
CommitLineData
2874c5fd 1// SPDX-License-Identifier: GPL-2.0-or-later
7b5a080b
HX
2/*
3 * Synchronous Cryptographic Hash operations.
4 *
5 * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
7b5a080b
HX
6 */
7
3b2f6df0 8#include <crypto/scatterwalk.h>
42808e5d 9#include <linux/cryptouser.h>
7b5a080b
HX
10#include <linux/err.h>
11#include <linux/kernel.h>
12#include <linux/module.h>
7b5a080b 13#include <linux/seq_file.h>
42808e5d 14#include <linux/string.h>
f4d663ce 15#include <net/netlink.h>
7b5a080b 16
42808e5d 17#include "hash.h"
3b2f6df0 18
3f683d61
HX
19static const struct crypto_type crypto_shash_type;
20
42808e5d
HX
21static inline struct crypto_istat_hash *shash_get_stat(struct shash_alg *alg)
22{
23 return hash_get_stat(&alg->halg);
24}
25
26static inline int crypto_shash_errstat(struct shash_alg *alg, int err)
27{
28 return crypto_hash_errstat(&alg->halg, err);
29}
30
c060e16d
EB
31int shash_no_setkey(struct crypto_shash *tfm, const u8 *key,
32 unsigned int keylen)
57cfe44b
HX
33{
34 return -ENOSYS;
35}
c060e16d 36EXPORT_SYMBOL_GPL(shash_no_setkey);
57cfe44b 37
ba7d7433
EB
38static void shash_set_needkey(struct crypto_shash *tfm, struct shash_alg *alg)
39{
c2881789 40 if (crypto_shash_alg_needs_key(alg))
ba7d7433
EB
41 crypto_shash_set_flags(tfm, CRYPTO_TFM_NEED_KEY);
42}
43
7b5a080b
HX
44int crypto_shash_setkey(struct crypto_shash *tfm, const u8 *key,
45 unsigned int keylen)
46{
47 struct shash_alg *shash = crypto_shash_alg(tfm);
9fa68f62 48 int err;
7b5a080b 49
345bfa3c 50 err = shash->setkey(tfm, key, keylen);
ba7d7433
EB
51 if (unlikely(err)) {
52 shash_set_needkey(tfm, shash);
9fa68f62 53 return err;
ba7d7433 54 }
7b5a080b 55
9fa68f62
EB
56 crypto_shash_clear_flags(tfm, CRYPTO_TFM_NEED_KEY);
57 return 0;
7b5a080b
HX
58}
59EXPORT_SYMBOL_GPL(crypto_shash_setkey);
60
7b5a080b
HX
61int crypto_shash_update(struct shash_desc *desc, const u8 *data,
62 unsigned int len)
63{
345bfa3c 64 struct shash_alg *shash = crypto_shash_alg(desc->tfm);
42808e5d
HX
65 int err;
66
67 if (IS_ENABLED(CONFIG_CRYPTO_STATS))
68 atomic64_add(len, &shash_get_stat(shash)->hash_tlen);
7b5a080b 69
345bfa3c 70 err = shash->update(desc, data, len);
7b5a080b 71
42808e5d 72 return crypto_shash_errstat(shash, err);
7b5a080b
HX
73}
74EXPORT_SYMBOL_GPL(crypto_shash_update);
75
7b5a080b
HX
76int crypto_shash_final(struct shash_desc *desc, u8 *out)
77{
345bfa3c 78 struct shash_alg *shash = crypto_shash_alg(desc->tfm);
42808e5d
HX
79 int err;
80
81 if (IS_ENABLED(CONFIG_CRYPTO_STATS))
82 atomic64_inc(&shash_get_stat(shash)->hash_cnt);
7b5a080b 83
345bfa3c 84 err = shash->final(desc, out);
7b5a080b 85
42808e5d 86 return crypto_shash_errstat(shash, err);
7b5a080b
HX
87}
88EXPORT_SYMBOL_GPL(crypto_shash_final);
89
313a4074
EB
90static int shash_default_finup(struct shash_desc *desc, const u8 *data,
91 unsigned int len, u8 *out)
92{
93 struct shash_alg *shash = crypto_shash_alg(desc->tfm);
94
95 return shash->update(desc, data, len) ?:
96 shash->final(desc, out);
97}
98
7b5a080b
HX
99int crypto_shash_finup(struct shash_desc *desc, const u8 *data,
100 unsigned int len, u8 *out)
101{
102 struct crypto_shash *tfm = desc->tfm;
103 struct shash_alg *shash = crypto_shash_alg(tfm);
42808e5d
HX
104 int err;
105
106 if (IS_ENABLED(CONFIG_CRYPTO_STATS)) {
107 struct crypto_istat_hash *istat = shash_get_stat(shash);
108
109 atomic64_inc(&istat->hash_cnt);
110 atomic64_add(len, &istat->hash_tlen);
111 }
7b5a080b 112
345bfa3c 113 err = shash->finup(desc, data, len, out);
7b5a080b 114
42808e5d 115 return crypto_shash_errstat(shash, err);
7b5a080b
HX
116}
117EXPORT_SYMBOL_GPL(crypto_shash_finup);
118
313a4074
EB
119static int shash_default_digest(struct shash_desc *desc, const u8 *data,
120 unsigned int len, u8 *out)
121{
122 struct shash_alg *shash = crypto_shash_alg(desc->tfm);
123
124 return shash->init(desc) ?:
125 shash->finup(desc, data, len, out);
126}
127
7b5a080b
HX
128int crypto_shash_digest(struct shash_desc *desc, const u8 *data,
129 unsigned int len, u8 *out)
130{
131 struct crypto_shash *tfm = desc->tfm;
132 struct shash_alg *shash = crypto_shash_alg(tfm);
42808e5d 133 int err;
7b5a080b 134
42808e5d
HX
135 if (IS_ENABLED(CONFIG_CRYPTO_STATS)) {
136 struct crypto_istat_hash *istat = shash_get_stat(shash);
9fa68f62 137
42808e5d
HX
138 atomic64_inc(&istat->hash_cnt);
139 atomic64_add(len, &istat->hash_tlen);
140 }
7b5a080b 141
42808e5d
HX
142 if (crypto_shash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
143 err = -ENOKEY;
42808e5d
HX
144 else
145 err = shash->digest(desc, data, len, out);
146
147 return crypto_shash_errstat(shash, err);
7b5a080b
HX
148}
149EXPORT_SYMBOL_GPL(crypto_shash_digest);
150
822a98b8
EB
151int crypto_shash_tfm_digest(struct crypto_shash *tfm, const u8 *data,
152 unsigned int len, u8 *out)
153{
154 SHASH_DESC_ON_STACK(desc, tfm);
155 int err;
156
157 desc->tfm = tfm;
158
159 err = crypto_shash_digest(desc, data, len, out);
160
161 shash_desc_zero(desc);
162
163 return err;
164}
165EXPORT_SYMBOL_GPL(crypto_shash_tfm_digest);
166
08debaa5 167int crypto_shash_export(struct shash_desc *desc, void *out)
dec8b786 168{
08debaa5
EB
169 struct crypto_shash *tfm = desc->tfm;
170 struct shash_alg *shash = crypto_shash_alg(tfm);
171
172 if (shash->export)
173 return shash->export(desc, out);
174
175 memcpy(out, shash_desc_ctx(desc), crypto_shash_descsize(tfm));
f592682f 176 return 0;
99d27e1c 177}
08debaa5 178EXPORT_SYMBOL_GPL(crypto_shash_export);
dec8b786 179
08debaa5 180int crypto_shash_import(struct shash_desc *desc, const void *in)
99d27e1c 181{
08debaa5
EB
182 struct crypto_shash *tfm = desc->tfm;
183 struct shash_alg *shash = crypto_shash_alg(tfm);
184
185 if (crypto_shash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
186 return -ENOKEY;
187
188 if (shash->import)
189 return shash->import(desc, in);
190
191 memcpy(shash_desc_ctx(desc), in, crypto_shash_descsize(tfm));
f592682f 192 return 0;
dec8b786 193}
08debaa5 194EXPORT_SYMBOL_GPL(crypto_shash_import);
dec8b786 195
3b2f6df0
HX
196static int shash_async_setkey(struct crypto_ahash *tfm, const u8 *key,
197 unsigned int keylen)
198{
199 struct crypto_shash **ctx = crypto_ahash_ctx(tfm);
200
201 return crypto_shash_setkey(*ctx, key, keylen);
202}
203
204static int shash_async_init(struct ahash_request *req)
205{
206 struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
207 struct shash_desc *desc = ahash_request_ctx(req);
208
209 desc->tfm = *ctx;
3b2f6df0
HX
210
211 return crypto_shash_init(desc);
212}
213
7eddf95e 214int shash_ahash_update(struct ahash_request *req, struct shash_desc *desc)
3b2f6df0 215{
3b2f6df0
HX
216 struct crypto_hash_walk walk;
217 int nbytes;
218
219 for (nbytes = crypto_hash_walk_first(req, &walk); nbytes > 0;
220 nbytes = crypto_hash_walk_done(&walk, nbytes))
221 nbytes = crypto_shash_update(desc, walk.data, nbytes);
222
223 return nbytes;
224}
7eddf95e
HX
225EXPORT_SYMBOL_GPL(shash_ahash_update);
226
227static int shash_async_update(struct ahash_request *req)
228{
229 return shash_ahash_update(req, ahash_request_ctx(req));
230}
3b2f6df0
HX
231
232static int shash_async_final(struct ahash_request *req)
233{
234 return crypto_shash_final(ahash_request_ctx(req), req->result);
235}
236
66f6ce5e
HX
237int shash_ahash_finup(struct ahash_request *req, struct shash_desc *desc)
238{
239 struct crypto_hash_walk walk;
240 int nbytes;
241
cbc86b91
HX
242 nbytes = crypto_hash_walk_first(req, &walk);
243 if (!nbytes)
244 return crypto_shash_final(desc, req->result);
245
246 do {
66f6ce5e
HX
247 nbytes = crypto_hash_walk_last(&walk) ?
248 crypto_shash_finup(desc, walk.data, nbytes,
249 req->result) :
250 crypto_shash_update(desc, walk.data, nbytes);
cbc86b91
HX
251 nbytes = crypto_hash_walk_done(&walk, nbytes);
252 } while (nbytes > 0);
66f6ce5e
HX
253
254 return nbytes;
255}
256EXPORT_SYMBOL_GPL(shash_ahash_finup);
257
258static int shash_async_finup(struct ahash_request *req)
259{
260 struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
261 struct shash_desc *desc = ahash_request_ctx(req);
262
263 desc->tfm = *ctx;
66f6ce5e
HX
264
265 return shash_ahash_finup(req, desc);
266}
267
7eddf95e 268int shash_ahash_digest(struct ahash_request *req, struct shash_desc *desc)
3b2f6df0 269{
3b2f6df0 270 unsigned int nbytes = req->nbytes;
b61907bb
HX
271 struct scatterlist *sg;
272 unsigned int offset;
3b2f6df0
HX
273 int err;
274
b61907bb
HX
275 if (nbytes &&
276 (sg = req->src, offset = sg->offset,
67cb60e4 277 nbytes <= min(sg->length, ((unsigned int)(PAGE_SIZE)) - offset))) {
3b2f6df0
HX
278 void *data;
279
aa969515 280 data = kmap_local_page(sg_page(sg));
3b2f6df0
HX
281 err = crypto_shash_digest(desc, data + offset, nbytes,
282 req->result);
aa969515 283 kunmap_local(data);
7eddf95e
HX
284 } else
285 err = crypto_shash_init(desc) ?:
66f6ce5e 286 shash_ahash_finup(req, desc);
3b2f6df0 287
7eddf95e
HX
288 return err;
289}
290EXPORT_SYMBOL_GPL(shash_ahash_digest);
3b2f6df0 291
7eddf95e
HX
292static int shash_async_digest(struct ahash_request *req)
293{
294 struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
295 struct shash_desc *desc = ahash_request_ctx(req);
3b2f6df0 296
7eddf95e 297 desc->tfm = *ctx;
3b2f6df0 298
7eddf95e 299 return shash_ahash_digest(req, desc);
3b2f6df0
HX
300}
301
66f6ce5e
HX
302static int shash_async_export(struct ahash_request *req, void *out)
303{
304 return crypto_shash_export(ahash_request_ctx(req), out);
305}
306
307static int shash_async_import(struct ahash_request *req, const void *in)
308{
90246e79
HX
309 struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
310 struct shash_desc *desc = ahash_request_ctx(req);
311
312 desc->tfm = *ctx;
90246e79
HX
313
314 return crypto_shash_import(desc, in);
66f6ce5e
HX
315}
316
3b2f6df0
HX
317static void crypto_exit_shash_ops_async(struct crypto_tfm *tfm)
318{
319 struct crypto_shash **ctx = crypto_tfm_ctx(tfm);
320
321 crypto_free_shash(*ctx);
322}
323
88056ec3 324int crypto_init_shash_ops_async(struct crypto_tfm *tfm)
3b2f6df0
HX
325{
326 struct crypto_alg *calg = tfm->__crt_alg;
66f6ce5e 327 struct shash_alg *alg = __crypto_shash_alg(calg);
88056ec3 328 struct crypto_ahash *crt = __crypto_ahash_cast(tfm);
3b2f6df0
HX
329 struct crypto_shash **ctx = crypto_tfm_ctx(tfm);
330 struct crypto_shash *shash;
331
332 if (!crypto_mod_get(calg))
333 return -EAGAIN;
334
3f683d61 335 shash = crypto_create_tfm(calg, &crypto_shash_type);
3b2f6df0
HX
336 if (IS_ERR(shash)) {
337 crypto_mod_put(calg);
338 return PTR_ERR(shash);
339 }
340
341 *ctx = shash;
342 tfm->exit = crypto_exit_shash_ops_async;
343
344 crt->init = shash_async_init;
345 crt->update = shash_async_update;
66f6ce5e
HX
346 crt->final = shash_async_final;
347 crt->finup = shash_async_finup;
3b2f6df0 348 crt->digest = shash_async_digest;
ba7d7433
EB
349 if (crypto_shash_alg_has_setkey(alg))
350 crt->setkey = shash_async_setkey;
00420a65 351
9fa68f62
EB
352 crypto_ahash_set_flags(crt, crypto_shash_get_flags(shash) &
353 CRYPTO_TFM_NEED_KEY);
66f6ce5e 354
2b091e32
EB
355 crt->export = shash_async_export;
356 crt->import = shash_async_import;
3b2f6df0 357
3b2f6df0
HX
358 crt->reqsize = sizeof(struct shash_desc) + crypto_shash_descsize(shash);
359
360 return 0;
361}
362
ed3630b8
HX
363struct crypto_ahash *crypto_clone_shash_ops_async(struct crypto_ahash *nhash,
364 struct crypto_ahash *hash)
365{
366 struct crypto_shash **nctx = crypto_ahash_ctx(nhash);
367 struct crypto_shash **ctx = crypto_ahash_ctx(hash);
368 struct crypto_shash *shash;
369
370 shash = crypto_clone_shash(*ctx);
371 if (IS_ERR(shash)) {
372 crypto_free_ahash(nhash);
373 return ERR_CAST(shash);
374 }
375
376 *nctx = shash;
377
378 return nhash;
379}
380
fbce6be5
HX
381static void crypto_shash_exit_tfm(struct crypto_tfm *tfm)
382{
383 struct crypto_shash *hash = __crypto_shash_cast(tfm);
384 struct shash_alg *alg = crypto_shash_alg(hash);
385
386 alg->exit_tfm(hash);
387}
388
2ca33da1 389static int crypto_shash_init_tfm(struct crypto_tfm *tfm)
7b5a080b 390{
113adefc 391 struct crypto_shash *hash = __crypto_shash_cast(tfm);
9fa68f62 392 struct shash_alg *alg = crypto_shash_alg(hash);
fbce6be5 393 int err;
9fa68f62
EB
394
395 hash->descsize = alg->descsize;
396
ba7d7433 397 shash_set_needkey(hash, alg);
113adefc 398
fbce6be5
HX
399 if (alg->exit_tfm)
400 tfm->exit = crypto_shash_exit_tfm;
401
402 if (!alg->init_tfm)
403 return 0;
404
405 err = alg->init_tfm(hash);
406 if (err)
407 return err;
408
409 /* ->init_tfm() may have increased the descsize. */
410 if (WARN_ON_ONCE(hash->descsize > HASH_MAX_DESCSIZE)) {
411 if (alg->exit_tfm)
412 alg->exit_tfm(hash);
413 return -EINVAL;
414 }
415
7b5a080b
HX
416 return 0;
417}
418
48fb3e57
EB
419static void crypto_shash_free_instance(struct crypto_instance *inst)
420{
421 struct shash_instance *shash = shash_instance(inst);
422
48fb3e57
EB
423 shash->free(shash);
424}
425
c0f9e01d
HX
426static int __maybe_unused crypto_shash_report(
427 struct sk_buff *skb, struct crypto_alg *alg)
f4d663ce
SK
428{
429 struct crypto_report_hash rhash;
430 struct shash_alg *salg = __crypto_shash_alg(alg);
431
37db69e0
EB
432 memset(&rhash, 0, sizeof(rhash));
433
434 strscpy(rhash.type, "shash", sizeof(rhash.type));
9a5467bf 435
f4d663ce
SK
436 rhash.blocksize = alg->cra_blocksize;
437 rhash.digestsize = salg->digestsize;
438
37db69e0 439 return nla_put(skb, CRYPTOCFGA_REPORT_HASH, sizeof(rhash), &rhash);
f4d663ce
SK
440}
441
7b5a080b 442static void crypto_shash_show(struct seq_file *m, struct crypto_alg *alg)
d8c34b94 443 __maybe_unused;
7b5a080b
HX
444static void crypto_shash_show(struct seq_file *m, struct crypto_alg *alg)
445{
446 struct shash_alg *salg = __crypto_shash_alg(alg);
447
448 seq_printf(m, "type : shash\n");
449 seq_printf(m, "blocksize : %u\n", alg->cra_blocksize);
450 seq_printf(m, "digestsize : %u\n", salg->digestsize);
7b5a080b
HX
451}
452
42808e5d
HX
453static int __maybe_unused crypto_shash_report_stat(
454 struct sk_buff *skb, struct crypto_alg *alg)
455{
456 return crypto_hash_report_stat(skb, alg, "shash");
457}
458
7b5a080b 459static const struct crypto_type crypto_shash_type = {
ac611680 460 .extsize = crypto_alg_extsize,
7b5a080b 461 .init_tfm = crypto_shash_init_tfm,
48fb3e57 462 .free = crypto_shash_free_instance,
7b5a080b
HX
463#ifdef CONFIG_PROC_FS
464 .show = crypto_shash_show,
465#endif
b8969a1b 466#if IS_ENABLED(CONFIG_CRYPTO_USER)
f4d663ce 467 .report = crypto_shash_report,
c0f9e01d 468#endif
42808e5d
HX
469#ifdef CONFIG_CRYPTO_STATS
470 .report_stat = crypto_shash_report_stat,
471#endif
7b5a080b
HX
472 .maskclear = ~CRYPTO_ALG_TYPE_MASK,
473 .maskset = CRYPTO_ALG_TYPE_MASK,
474 .type = CRYPTO_ALG_TYPE_SHASH,
475 .tfmsize = offsetof(struct crypto_shash, base),
476};
477
fdfad1ff
EB
478int crypto_grab_shash(struct crypto_shash_spawn *spawn,
479 struct crypto_instance *inst,
480 const char *name, u32 type, u32 mask)
481{
482 spawn->base.frontend = &crypto_shash_type;
483 return crypto_grab_spawn(&spawn->base, inst, name, type, mask);
484}
485EXPORT_SYMBOL_GPL(crypto_grab_shash);
486
7b5a080b
HX
487struct crypto_shash *crypto_alloc_shash(const char *alg_name, u32 type,
488 u32 mask)
489{
3f683d61 490 return crypto_alloc_tfm(alg_name, &crypto_shash_type, type, mask);
7b5a080b
HX
491}
492EXPORT_SYMBOL_GPL(crypto_alloc_shash);
493
85cc4243
HR
494int crypto_has_shash(const char *alg_name, u32 type, u32 mask)
495{
496 return crypto_type_has_alg(alg_name, &crypto_shash_type, type, mask);
497}
498EXPORT_SYMBOL_GPL(crypto_has_shash);
499
ed3630b8
HX
500struct crypto_shash *crypto_clone_shash(struct crypto_shash *hash)
501{
502 struct crypto_tfm *tfm = crypto_shash_tfm(hash);
503 struct shash_alg *alg = crypto_shash_alg(hash);
504 struct crypto_shash *nhash;
505 int err;
506
507 if (!crypto_shash_alg_has_setkey(alg)) {
508 tfm = crypto_tfm_get(tfm);
509 if (IS_ERR(tfm))
510 return ERR_CAST(tfm);
511
512 return hash;
513 }
514
b7be31b0 515 if (!alg->clone_tfm && (alg->init_tfm || alg->base.cra_init))
ed3630b8
HX
516 return ERR_PTR(-ENOSYS);
517
518 nhash = crypto_clone_tfm(&crypto_shash_type, tfm);
519 if (IS_ERR(nhash))
520 return nhash;
521
522 nhash->descsize = hash->descsize;
523
b7be31b0
HX
524 if (alg->clone_tfm) {
525 err = alg->clone_tfm(nhash, hash);
526 if (err) {
527 crypto_free_shash(nhash);
528 return ERR_PTR(err);
529 }
ed3630b8
HX
530 }
531
532 return nhash;
533}
534EXPORT_SYMBOL_GPL(crypto_clone_shash);
535
42808e5d 536int hash_prepare_alg(struct hash_alg_common *alg)
7b5a080b 537{
42808e5d 538 struct crypto_istat_hash *istat = hash_get_stat(alg);
7b5a080b
HX
539 struct crypto_alg *base = &alg->base;
540
9697b328 541 if (alg->digestsize > HASH_MAX_DIGESTSIZE)
7b5a080b
HX
542 return -EINVAL;
543
42808e5d
HX
544 base->cra_flags &= ~CRYPTO_ALG_TYPE_MASK;
545
546 if (IS_ENABLED(CONFIG_CRYPTO_STATS))
547 memset(istat, 0, sizeof(*istat));
548
549 return 0;
550}
551
552static int shash_prepare_alg(struct shash_alg *alg)
553{
554 struct crypto_alg *base = &alg->halg.base;
555 int err;
556
557 if (alg->descsize > HASH_MAX_DESCSIZE)
558 return -EINVAL;
559
345bfa3c
EB
560 /* alignmask is not useful for shash, so it is not supported. */
561 if (base->cra_alignmask)
1c799571
HX
562 return -EINVAL;
563
41a2e94f
EB
564 if ((alg->export && !alg->import) || (alg->import && !alg->export))
565 return -EINVAL;
566
42808e5d
HX
567 err = hash_prepare_alg(&alg->halg);
568 if (err)
569 return err;
570
7b5a080b 571 base->cra_type = &crypto_shash_type;
7b5a080b 572 base->cra_flags |= CRYPTO_ALG_TYPE_SHASH;
99d27e1c 573
08debaa5
EB
574 /*
575 * Handle missing optional functions. For each one we can either
576 * install a default here, or we can leave the pointer as NULL and check
577 * the pointer for NULL in crypto_shash_*(), avoiding an indirect call
578 * when the default behavior is desired. For ->finup and ->digest we
579 * install defaults, since for optimal performance algorithms should
580 * implement these anyway. On the other hand, for ->import and
581 * ->export the common case and best performance comes from the simple
582 * memcpy of the shash_desc_ctx, so when those pointers are NULL we
583 * leave them NULL and provide the memcpy with no indirect call.
584 */
8267adab 585 if (!alg->finup)
313a4074 586 alg->finup = shash_default_finup;
8267adab 587 if (!alg->digest)
313a4074 588 alg->digest = shash_default_digest;
08debaa5 589 if (!alg->export)
42808e5d 590 alg->halg.statesize = alg->descsize;
57cfe44b
HX
591 if (!alg->setkey)
592 alg->setkey = shash_no_setkey;
99d27e1c 593
619a6ebd
HX
594 return 0;
595}
596
597int crypto_register_shash(struct shash_alg *alg)
598{
599 struct crypto_alg *base = &alg->base;
600 int err;
601
602 err = shash_prepare_alg(alg);
603 if (err)
604 return err;
7b5a080b
HX
605
606 return crypto_register_alg(base);
607}
608EXPORT_SYMBOL_GPL(crypto_register_shash);
609
c6d633a9 610void crypto_unregister_shash(struct shash_alg *alg)
7b5a080b 611{
c6d633a9 612 crypto_unregister_alg(&alg->base);
7b5a080b
HX
613}
614EXPORT_SYMBOL_GPL(crypto_unregister_shash);
615
50fc3e8d
JK
616int crypto_register_shashes(struct shash_alg *algs, int count)
617{
618 int i, ret;
619
620 for (i = 0; i < count; i++) {
621 ret = crypto_register_shash(&algs[i]);
622 if (ret)
623 goto err;
624 }
625
626 return 0;
627
628err:
629 for (--i; i >= 0; --i)
630 crypto_unregister_shash(&algs[i]);
631
632 return ret;
633}
634EXPORT_SYMBOL_GPL(crypto_register_shashes);
635
c6d633a9 636void crypto_unregister_shashes(struct shash_alg *algs, int count)
50fc3e8d 637{
c6d633a9 638 int i;
50fc3e8d 639
c6d633a9
EB
640 for (i = count - 1; i >= 0; --i)
641 crypto_unregister_shash(&algs[i]);
50fc3e8d
JK
642}
643EXPORT_SYMBOL_GPL(crypto_unregister_shashes);
644
619a6ebd
HX
645int shash_register_instance(struct crypto_template *tmpl,
646 struct shash_instance *inst)
647{
648 int err;
649
d4fdc2df
EB
650 if (WARN_ON(!inst->free))
651 return -EINVAL;
652
619a6ebd
HX
653 err = shash_prepare_alg(&inst->alg);
654 if (err)
655 return err;
656
657 return crypto_register_instance(tmpl, shash_crypto_instance(inst));
658}
659EXPORT_SYMBOL_GPL(shash_register_instance);
660
a39c66cc 661void shash_free_singlespawn_instance(struct shash_instance *inst)
2e4fddd8 662{
a39c66cc
EB
663 crypto_drop_spawn(shash_instance_ctx(inst));
664 kfree(inst);
2e4fddd8 665}
a39c66cc 666EXPORT_SYMBOL_GPL(shash_free_singlespawn_instance);
2e4fddd8 667
7b5a080b
HX
668MODULE_LICENSE("GPL");
669MODULE_DESCRIPTION("Synchronous cryptographic hash type");