1 /*
2  * Synchronous Cryptographic Hash operations.
3  *
4  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by the Free
8  * Software Foundation; either version 2 of the License, or (at your option)
9  * any later version.
10  *
11  */
12 
13 #include <crypto/scatterwalk.h>
14 #include <crypto/internal/hash.h>
15 #include <linux/err.h>
16 #include <linux/kernel.h>
17 #include <linux/module.h>
18 #include <linux/slab.h>
19 #include <linux/seq_file.h>
20 #include <linux/cryptouser.h>
21 #include <net/netlink.h>
22 #include <linux/compiler.h>
23 
24 #include "internal.h"
25 
26 static const struct crypto_type crypto_shash_type;
27 
shash_no_setkey(struct crypto_shash * tfm,const u8 * key,unsigned int keylen)28 static int shash_no_setkey(struct crypto_shash *tfm, const u8 *key,
29 			   unsigned int keylen)
30 {
31 	return -ENOSYS;
32 }
33 
34 /*
35  * Check whether an shash algorithm has a setkey function.
36  *
37  * For CFI compatibility, this must not be an inline function.  This is because
38  * when CFI is enabled, modules won't get the same address for shash_no_setkey
39  * (if it were exported, which inlining would require) as the core kernel will.
40  */
crypto_shash_alg_has_setkey(struct shash_alg * alg)41 bool crypto_shash_alg_has_setkey(struct shash_alg *alg)
42 {
43 	return alg->setkey != shash_no_setkey;
44 }
45 EXPORT_SYMBOL_GPL(crypto_shash_alg_has_setkey);
46 
shash_setkey_unaligned(struct crypto_shash * tfm,const u8 * key,unsigned int keylen)47 static int shash_setkey_unaligned(struct crypto_shash *tfm, const u8 *key,
48 				  unsigned int keylen)
49 {
50 	struct shash_alg *shash = crypto_shash_alg(tfm);
51 	unsigned long alignmask = crypto_shash_alignmask(tfm);
52 	unsigned long absize;
53 	u8 *buffer, *alignbuffer;
54 	int err;
55 
56 	absize = keylen + (alignmask & ~(crypto_tfm_ctx_alignment() - 1));
57 	buffer = kmalloc(absize, GFP_ATOMIC);
58 	if (!buffer)
59 		return -ENOMEM;
60 
61 	alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1);
62 	memcpy(alignbuffer, key, keylen);
63 	err = shash->setkey(tfm, alignbuffer, keylen);
64 	kzfree(buffer);
65 	return err;
66 }
67 
shash_set_needkey(struct crypto_shash * tfm,struct shash_alg * alg)68 static void shash_set_needkey(struct crypto_shash *tfm, struct shash_alg *alg)
69 {
70 	if (crypto_shash_alg_has_setkey(alg) &&
71 	    !(alg->base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY))
72 		crypto_shash_set_flags(tfm, CRYPTO_TFM_NEED_KEY);
73 }
74 
crypto_shash_setkey(struct crypto_shash * tfm,const u8 * key,unsigned int keylen)75 int crypto_shash_setkey(struct crypto_shash *tfm, const u8 *key,
76 			unsigned int keylen)
77 {
78 	struct shash_alg *shash = crypto_shash_alg(tfm);
79 	unsigned long alignmask = crypto_shash_alignmask(tfm);
80 	int err;
81 
82 	if ((unsigned long)key & alignmask)
83 		err = shash_setkey_unaligned(tfm, key, keylen);
84 	else
85 		err = shash->setkey(tfm, key, keylen);
86 
87 	if (unlikely(err)) {
88 		shash_set_needkey(tfm, shash);
89 		return err;
90 	}
91 
92 	crypto_shash_clear_flags(tfm, CRYPTO_TFM_NEED_KEY);
93 	return 0;
94 }
95 EXPORT_SYMBOL_GPL(crypto_shash_setkey);
96 
shash_align_buffer_size(unsigned len,unsigned long mask)97 static inline unsigned int shash_align_buffer_size(unsigned len,
98 						   unsigned long mask)
99 {
100 	typedef u8 __aligned_largest u8_aligned;
101 	return len + (mask & ~(__alignof__(u8_aligned) - 1));
102 }
103 
shash_update_unaligned(struct shash_desc * desc,const u8 * data,unsigned int len)104 static int shash_update_unaligned(struct shash_desc *desc, const u8 *data,
105 				  unsigned int len)
106 {
107 	struct crypto_shash *tfm = desc->tfm;
108 	struct shash_alg *shash = crypto_shash_alg(tfm);
109 	unsigned long alignmask = crypto_shash_alignmask(tfm);
110 	unsigned int unaligned_len = alignmask + 1 -
111 				     ((unsigned long)data & alignmask);
112 	u8 ubuf[shash_align_buffer_size(unaligned_len, alignmask)]
113 		__aligned_largest;
114 	u8 *buf = PTR_ALIGN(&ubuf[0], alignmask + 1);
115 	int err;
116 
117 	if (unaligned_len > len)
118 		unaligned_len = len;
119 
120 	memcpy(buf, data, unaligned_len);
121 	err = shash->update(desc, buf, unaligned_len);
122 	memset(buf, 0, unaligned_len);
123 
124 	return err ?:
125 	       shash->update(desc, data + unaligned_len, len - unaligned_len);
126 }
127 
crypto_shash_update(struct shash_desc * desc,const u8 * data,unsigned int len)128 int crypto_shash_update(struct shash_desc *desc, const u8 *data,
129 			unsigned int len)
130 {
131 	struct crypto_shash *tfm = desc->tfm;
132 	struct shash_alg *shash = crypto_shash_alg(tfm);
133 	unsigned long alignmask = crypto_shash_alignmask(tfm);
134 
135 	if ((unsigned long)data & alignmask)
136 		return shash_update_unaligned(desc, data, len);
137 
138 	return shash->update(desc, data, len);
139 }
140 EXPORT_SYMBOL_GPL(crypto_shash_update);
141 
shash_final_unaligned(struct shash_desc * desc,u8 * out)142 static int shash_final_unaligned(struct shash_desc *desc, u8 *out)
143 {
144 	struct crypto_shash *tfm = desc->tfm;
145 	unsigned long alignmask = crypto_shash_alignmask(tfm);
146 	struct shash_alg *shash = crypto_shash_alg(tfm);
147 	unsigned int ds = crypto_shash_digestsize(tfm);
148 	u8 ubuf[shash_align_buffer_size(ds, alignmask)]
149 		__aligned_largest;
150 	u8 *buf = PTR_ALIGN(&ubuf[0], alignmask + 1);
151 	int err;
152 
153 	err = shash->final(desc, buf);
154 	if (err)
155 		goto out;
156 
157 	memcpy(out, buf, ds);
158 
159 out:
160 	memset(buf, 0, ds);
161 	return err;
162 }
163 
crypto_shash_final(struct shash_desc * desc,u8 * out)164 int crypto_shash_final(struct shash_desc *desc, u8 *out)
165 {
166 	struct crypto_shash *tfm = desc->tfm;
167 	struct shash_alg *shash = crypto_shash_alg(tfm);
168 	unsigned long alignmask = crypto_shash_alignmask(tfm);
169 
170 	if ((unsigned long)out & alignmask)
171 		return shash_final_unaligned(desc, out);
172 
173 	return shash->final(desc, out);
174 }
175 EXPORT_SYMBOL_GPL(crypto_shash_final);
176 
shash_finup_unaligned(struct shash_desc * desc,const u8 * data,unsigned int len,u8 * out)177 static int shash_finup_unaligned(struct shash_desc *desc, const u8 *data,
178 				 unsigned int len, u8 *out)
179 {
180 	return crypto_shash_update(desc, data, len) ?:
181 	       crypto_shash_final(desc, out);
182 }
183 
crypto_shash_finup(struct shash_desc * desc,const u8 * data,unsigned int len,u8 * out)184 int crypto_shash_finup(struct shash_desc *desc, const u8 *data,
185 		       unsigned int len, u8 *out)
186 {
187 	struct crypto_shash *tfm = desc->tfm;
188 	struct shash_alg *shash = crypto_shash_alg(tfm);
189 	unsigned long alignmask = crypto_shash_alignmask(tfm);
190 
191 	if (((unsigned long)data | (unsigned long)out) & alignmask)
192 		return shash_finup_unaligned(desc, data, len, out);
193 
194 	return shash->finup(desc, data, len, out);
195 }
196 EXPORT_SYMBOL_GPL(crypto_shash_finup);
197 
shash_digest_unaligned(struct shash_desc * desc,const u8 * data,unsigned int len,u8 * out)198 static int shash_digest_unaligned(struct shash_desc *desc, const u8 *data,
199 				  unsigned int len, u8 *out)
200 {
201 	return crypto_shash_init(desc) ?:
202 	       crypto_shash_finup(desc, data, len, out);
203 }
204 
crypto_shash_digest(struct shash_desc * desc,const u8 * data,unsigned int len,u8 * out)205 int crypto_shash_digest(struct shash_desc *desc, const u8 *data,
206 			unsigned int len, u8 *out)
207 {
208 	struct crypto_shash *tfm = desc->tfm;
209 	struct shash_alg *shash = crypto_shash_alg(tfm);
210 	unsigned long alignmask = crypto_shash_alignmask(tfm);
211 
212 	if (crypto_shash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
213 		return -ENOKEY;
214 
215 	if (((unsigned long)data | (unsigned long)out) & alignmask)
216 		return shash_digest_unaligned(desc, data, len, out);
217 
218 	return shash->digest(desc, data, len, out);
219 }
220 EXPORT_SYMBOL_GPL(crypto_shash_digest);
221 
shash_default_export(struct shash_desc * desc,void * out)222 static int shash_default_export(struct shash_desc *desc, void *out)
223 {
224 	memcpy(out, shash_desc_ctx(desc), crypto_shash_descsize(desc->tfm));
225 	return 0;
226 }
227 
shash_default_import(struct shash_desc * desc,const void * in)228 static int shash_default_import(struct shash_desc *desc, const void *in)
229 {
230 	memcpy(shash_desc_ctx(desc), in, crypto_shash_descsize(desc->tfm));
231 	return 0;
232 }
233 
shash_async_setkey(struct crypto_ahash * tfm,const u8 * key,unsigned int keylen)234 static int shash_async_setkey(struct crypto_ahash *tfm, const u8 *key,
235 			      unsigned int keylen)
236 {
237 	struct crypto_shash **ctx = crypto_ahash_ctx(tfm);
238 
239 	return crypto_shash_setkey(*ctx, key, keylen);
240 }
241 
shash_async_init(struct ahash_request * req)242 static int shash_async_init(struct ahash_request *req)
243 {
244 	struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
245 	struct shash_desc *desc = ahash_request_ctx(req);
246 
247 	desc->tfm = *ctx;
248 	desc->flags = req->base.flags;
249 
250 	return crypto_shash_init(desc);
251 }
252 
shash_ahash_update(struct ahash_request * req,struct shash_desc * desc)253 int shash_ahash_update(struct ahash_request *req, struct shash_desc *desc)
254 {
255 	struct crypto_hash_walk walk;
256 	int nbytes;
257 
258 	for (nbytes = crypto_hash_walk_first(req, &walk); nbytes > 0;
259 	     nbytes = crypto_hash_walk_done(&walk, nbytes))
260 		nbytes = crypto_shash_update(desc, walk.data, nbytes);
261 
262 	return nbytes;
263 }
264 EXPORT_SYMBOL_GPL(shash_ahash_update);
265 
shash_async_update(struct ahash_request * req)266 static int shash_async_update(struct ahash_request *req)
267 {
268 	return shash_ahash_update(req, ahash_request_ctx(req));
269 }
270 
shash_async_final(struct ahash_request * req)271 static int shash_async_final(struct ahash_request *req)
272 {
273 	return crypto_shash_final(ahash_request_ctx(req), req->result);
274 }
275 
shash_ahash_finup(struct ahash_request * req,struct shash_desc * desc)276 int shash_ahash_finup(struct ahash_request *req, struct shash_desc *desc)
277 {
278 	struct crypto_hash_walk walk;
279 	int nbytes;
280 
281 	nbytes = crypto_hash_walk_first(req, &walk);
282 	if (!nbytes)
283 		return crypto_shash_final(desc, req->result);
284 
285 	do {
286 		nbytes = crypto_hash_walk_last(&walk) ?
287 			 crypto_shash_finup(desc, walk.data, nbytes,
288 					    req->result) :
289 			 crypto_shash_update(desc, walk.data, nbytes);
290 		nbytes = crypto_hash_walk_done(&walk, nbytes);
291 	} while (nbytes > 0);
292 
293 	return nbytes;
294 }
295 EXPORT_SYMBOL_GPL(shash_ahash_finup);
296 
shash_async_finup(struct ahash_request * req)297 static int shash_async_finup(struct ahash_request *req)
298 {
299 	struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
300 	struct shash_desc *desc = ahash_request_ctx(req);
301 
302 	desc->tfm = *ctx;
303 	desc->flags = req->base.flags;
304 
305 	return shash_ahash_finup(req, desc);
306 }
307 
shash_ahash_digest(struct ahash_request * req,struct shash_desc * desc)308 int shash_ahash_digest(struct ahash_request *req, struct shash_desc *desc)
309 {
310 	unsigned int nbytes = req->nbytes;
311 	struct scatterlist *sg;
312 	unsigned int offset;
313 	int err;
314 
315 	if (nbytes &&
316 	    (sg = req->src, offset = sg->offset,
317 	     nbytes < min(sg->length, ((unsigned int)(PAGE_SIZE)) - offset))) {
318 		void *data;
319 
320 		data = kmap_atomic(sg_page(sg));
321 		err = crypto_shash_digest(desc, data + offset, nbytes,
322 					  req->result);
323 		kunmap_atomic(data);
324 		crypto_yield(desc->flags);
325 	} else
326 		err = crypto_shash_init(desc) ?:
327 		      shash_ahash_finup(req, desc);
328 
329 	return err;
330 }
331 EXPORT_SYMBOL_GPL(shash_ahash_digest);
332 
shash_async_digest(struct ahash_request * req)333 static int shash_async_digest(struct ahash_request *req)
334 {
335 	struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
336 	struct shash_desc *desc = ahash_request_ctx(req);
337 
338 	desc->tfm = *ctx;
339 	desc->flags = req->base.flags;
340 
341 	return shash_ahash_digest(req, desc);
342 }
343 
shash_async_export(struct ahash_request * req,void * out)344 static int shash_async_export(struct ahash_request *req, void *out)
345 {
346 	return crypto_shash_export(ahash_request_ctx(req), out);
347 }
348 
shash_async_import(struct ahash_request * req,const void * in)349 static int shash_async_import(struct ahash_request *req, const void *in)
350 {
351 	struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
352 	struct shash_desc *desc = ahash_request_ctx(req);
353 
354 	desc->tfm = *ctx;
355 	desc->flags = req->base.flags;
356 
357 	return crypto_shash_import(desc, in);
358 }
359 
crypto_exit_shash_ops_async(struct crypto_tfm * tfm)360 static void crypto_exit_shash_ops_async(struct crypto_tfm *tfm)
361 {
362 	struct crypto_shash **ctx = crypto_tfm_ctx(tfm);
363 
364 	crypto_free_shash(*ctx);
365 }
366 
crypto_init_shash_ops_async(struct crypto_tfm * tfm)367 int crypto_init_shash_ops_async(struct crypto_tfm *tfm)
368 {
369 	struct crypto_alg *calg = tfm->__crt_alg;
370 	struct shash_alg *alg = __crypto_shash_alg(calg);
371 	struct crypto_ahash *crt = __crypto_ahash_cast(tfm);
372 	struct crypto_shash **ctx = crypto_tfm_ctx(tfm);
373 	struct crypto_shash *shash;
374 
375 	if (!crypto_mod_get(calg))
376 		return -EAGAIN;
377 
378 	shash = crypto_create_tfm(calg, &crypto_shash_type);
379 	if (IS_ERR(shash)) {
380 		crypto_mod_put(calg);
381 		return PTR_ERR(shash);
382 	}
383 
384 	*ctx = shash;
385 	tfm->exit = crypto_exit_shash_ops_async;
386 
387 	crt->init = shash_async_init;
388 	crt->update = shash_async_update;
389 	crt->final = shash_async_final;
390 	crt->finup = shash_async_finup;
391 	crt->digest = shash_async_digest;
392 	if (crypto_shash_alg_has_setkey(alg))
393 		crt->setkey = shash_async_setkey;
394 
395 	crypto_ahash_set_flags(crt, crypto_shash_get_flags(shash) &
396 				    CRYPTO_TFM_NEED_KEY);
397 
398 	if (alg->export)
399 		crt->export = shash_async_export;
400 	if (alg->import)
401 		crt->import = shash_async_import;
402 
403 	crt->reqsize = sizeof(struct shash_desc) + crypto_shash_descsize(shash);
404 
405 	return 0;
406 }
407 
crypto_shash_init_tfm(struct crypto_tfm * tfm)408 static int crypto_shash_init_tfm(struct crypto_tfm *tfm)
409 {
410 	struct crypto_shash *hash = __crypto_shash_cast(tfm);
411 	struct shash_alg *alg = crypto_shash_alg(hash);
412 
413 	hash->descsize = alg->descsize;
414 
415 	shash_set_needkey(hash, alg);
416 
417 	return 0;
418 }
419 
420 #ifdef CONFIG_NET
crypto_shash_report(struct sk_buff * skb,struct crypto_alg * alg)421 static int crypto_shash_report(struct sk_buff *skb, struct crypto_alg *alg)
422 {
423 	struct crypto_report_hash rhash;
424 	struct shash_alg *salg = __crypto_shash_alg(alg);
425 
426 	strncpy(rhash.type, "shash", sizeof(rhash.type));
427 
428 	rhash.blocksize = alg->cra_blocksize;
429 	rhash.digestsize = salg->digestsize;
430 
431 	if (nla_put(skb, CRYPTOCFGA_REPORT_HASH,
432 		    sizeof(struct crypto_report_hash), &rhash))
433 		goto nla_put_failure;
434 	return 0;
435 
436 nla_put_failure:
437 	return -EMSGSIZE;
438 }
439 #else
crypto_shash_report(struct sk_buff * skb,struct crypto_alg * alg)440 static int crypto_shash_report(struct sk_buff *skb, struct crypto_alg *alg)
441 {
442 	return -ENOSYS;
443 }
444 #endif
445 
446 static void crypto_shash_show(struct seq_file *m, struct crypto_alg *alg)
447 	__maybe_unused;
crypto_shash_show(struct seq_file * m,struct crypto_alg * alg)448 static void crypto_shash_show(struct seq_file *m, struct crypto_alg *alg)
449 {
450 	struct shash_alg *salg = __crypto_shash_alg(alg);
451 
452 	seq_printf(m, "type         : shash\n");
453 	seq_printf(m, "blocksize    : %u\n", alg->cra_blocksize);
454 	seq_printf(m, "digestsize   : %u\n", salg->digestsize);
455 }
456 
457 static const struct crypto_type crypto_shash_type = {
458 	.extsize = crypto_alg_extsize,
459 	.init_tfm = crypto_shash_init_tfm,
460 #ifdef CONFIG_PROC_FS
461 	.show = crypto_shash_show,
462 #endif
463 	.report = crypto_shash_report,
464 	.maskclear = ~CRYPTO_ALG_TYPE_MASK,
465 	.maskset = CRYPTO_ALG_TYPE_MASK,
466 	.type = CRYPTO_ALG_TYPE_SHASH,
467 	.tfmsize = offsetof(struct crypto_shash, base),
468 };
469 
crypto_alloc_shash(const char * alg_name,u32 type,u32 mask)470 struct crypto_shash *crypto_alloc_shash(const char *alg_name, u32 type,
471 					u32 mask)
472 {
473 	return crypto_alloc_tfm(alg_name, &crypto_shash_type, type, mask);
474 }
475 EXPORT_SYMBOL_GPL(crypto_alloc_shash);
476 
shash_prepare_alg(struct shash_alg * alg)477 static int shash_prepare_alg(struct shash_alg *alg)
478 {
479 	struct crypto_alg *base = &alg->base;
480 
481 	if (alg->digestsize > PAGE_SIZE / 8 ||
482 	    alg->descsize > PAGE_SIZE / 8 ||
483 	    alg->statesize > PAGE_SIZE / 8)
484 		return -EINVAL;
485 
486 	base->cra_type = &crypto_shash_type;
487 	base->cra_flags &= ~CRYPTO_ALG_TYPE_MASK;
488 	base->cra_flags |= CRYPTO_ALG_TYPE_SHASH;
489 
490 	if (!alg->finup)
491 		alg->finup = shash_finup_unaligned;
492 	if (!alg->digest)
493 		alg->digest = shash_digest_unaligned;
494 	if (!alg->export) {
495 		alg->export = shash_default_export;
496 		alg->import = shash_default_import;
497 		alg->statesize = alg->descsize;
498 	}
499 	if (!alg->setkey)
500 		alg->setkey = shash_no_setkey;
501 
502 	return 0;
503 }
504 
crypto_register_shash(struct shash_alg * alg)505 int crypto_register_shash(struct shash_alg *alg)
506 {
507 	struct crypto_alg *base = &alg->base;
508 	int err;
509 
510 	err = shash_prepare_alg(alg);
511 	if (err)
512 		return err;
513 
514 	return crypto_register_alg(base);
515 }
516 EXPORT_SYMBOL_GPL(crypto_register_shash);
517 
crypto_unregister_shash(struct shash_alg * alg)518 int crypto_unregister_shash(struct shash_alg *alg)
519 {
520 	return crypto_unregister_alg(&alg->base);
521 }
522 EXPORT_SYMBOL_GPL(crypto_unregister_shash);
523 
crypto_register_shashes(struct shash_alg * algs,int count)524 int crypto_register_shashes(struct shash_alg *algs, int count)
525 {
526 	int i, ret;
527 
528 	for (i = 0; i < count; i++) {
529 		ret = crypto_register_shash(&algs[i]);
530 		if (ret)
531 			goto err;
532 	}
533 
534 	return 0;
535 
536 err:
537 	for (--i; i >= 0; --i)
538 		crypto_unregister_shash(&algs[i]);
539 
540 	return ret;
541 }
542 EXPORT_SYMBOL_GPL(crypto_register_shashes);
543 
crypto_unregister_shashes(struct shash_alg * algs,int count)544 int crypto_unregister_shashes(struct shash_alg *algs, int count)
545 {
546 	int i, ret;
547 
548 	for (i = count - 1; i >= 0; --i) {
549 		ret = crypto_unregister_shash(&algs[i]);
550 		if (ret)
551 			pr_err("Failed to unregister %s %s: %d\n",
552 			       algs[i].base.cra_driver_name,
553 			       algs[i].base.cra_name, ret);
554 	}
555 
556 	return 0;
557 }
558 EXPORT_SYMBOL_GPL(crypto_unregister_shashes);
559 
shash_register_instance(struct crypto_template * tmpl,struct shash_instance * inst)560 int shash_register_instance(struct crypto_template *tmpl,
561 			    struct shash_instance *inst)
562 {
563 	int err;
564 
565 	err = shash_prepare_alg(&inst->alg);
566 	if (err)
567 		return err;
568 
569 	return crypto_register_instance(tmpl, shash_crypto_instance(inst));
570 }
571 EXPORT_SYMBOL_GPL(shash_register_instance);
572 
shash_free_instance(struct crypto_instance * inst)573 void shash_free_instance(struct crypto_instance *inst)
574 {
575 	crypto_drop_spawn(crypto_instance_ctx(inst));
576 	kfree(shash_instance(inst));
577 }
578 EXPORT_SYMBOL_GPL(shash_free_instance);
579 
crypto_init_shash_spawn(struct crypto_shash_spawn * spawn,struct shash_alg * alg,struct crypto_instance * inst)580 int crypto_init_shash_spawn(struct crypto_shash_spawn *spawn,
581 			    struct shash_alg *alg,
582 			    struct crypto_instance *inst)
583 {
584 	return crypto_init_spawn2(&spawn->base, &alg->base, inst,
585 				  &crypto_shash_type);
586 }
587 EXPORT_SYMBOL_GPL(crypto_init_shash_spawn);
588 
shash_attr_alg(struct rtattr * rta,u32 type,u32 mask)589 struct shash_alg *shash_attr_alg(struct rtattr *rta, u32 type, u32 mask)
590 {
591 	struct crypto_alg *alg;
592 
593 	alg = crypto_attr_alg2(rta, &crypto_shash_type, type, mask);
594 	return IS_ERR(alg) ? ERR_CAST(alg) :
595 	       container_of(alg, struct shash_alg, base);
596 }
597 EXPORT_SYMBOL_GPL(shash_attr_alg);
598 
599 MODULE_LICENSE("GPL");
600 MODULE_DESCRIPTION("Synchronous cryptographic hash type");
601