xref: /linux/crypto/algapi.c (revision 98066f2f8901ccf72f3c5d6c391c8fff1cabd49d)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Cryptographic API for algorithms (i.e., low-level API).
4  *
5  * Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au>
6  */
7 
8 #include <crypto/algapi.h>
9 #include <linux/err.h>
10 #include <linux/errno.h>
11 #include <linux/fips.h>
12 #include <linux/init.h>
13 #include <linux/kernel.h>
14 #include <linux/list.h>
15 #include <linux/module.h>
16 #include <linux/rtnetlink.h>
17 #include <linux/slab.h>
18 #include <linux/string.h>
19 #include <linux/workqueue.h>
20 
21 #include "internal.h"
22 
23 static LIST_HEAD(crypto_template_list);
24 
25 static inline void crypto_check_module_sig(struct module *mod)
26 {
27 	if (fips_enabled && mod && !module_sig_ok(mod))
28 		panic("Module %s signature verification failed in FIPS mode\n",
29 		      module_name(mod));
30 }
31 
32 static int crypto_check_alg(struct crypto_alg *alg)
33 {
34 	crypto_check_module_sig(alg->cra_module);
35 
36 	if (!alg->cra_name[0] || !alg->cra_driver_name[0])
37 		return -EINVAL;
38 
39 	if (alg->cra_alignmask & (alg->cra_alignmask + 1))
40 		return -EINVAL;
41 
42 	/* General maximums for all algs. */
43 	if (alg->cra_alignmask > MAX_ALGAPI_ALIGNMASK)
44 		return -EINVAL;
45 
46 	if (alg->cra_blocksize > MAX_ALGAPI_BLOCKSIZE)
47 		return -EINVAL;
48 
49 	/* Lower maximums for specific alg types. */
50 	if (!alg->cra_type && (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
51 			       CRYPTO_ALG_TYPE_CIPHER) {
52 		if (alg->cra_alignmask > MAX_CIPHER_ALIGNMASK)
53 			return -EINVAL;
54 
55 		if (alg->cra_blocksize > MAX_CIPHER_BLOCKSIZE)
56 			return -EINVAL;
57 	}
58 
59 	if (alg->cra_priority < 0)
60 		return -EINVAL;
61 
62 	refcount_set(&alg->cra_refcnt, 1);
63 
64 	return 0;
65 }
66 
67 static void crypto_free_instance(struct crypto_instance *inst)
68 {
69 	inst->alg.cra_type->free(inst);
70 }
71 
72 static void crypto_destroy_instance_workfn(struct work_struct *w)
73 {
74 	struct crypto_template *tmpl = container_of(w, struct crypto_template,
75 						    free_work);
76 	struct crypto_instance *inst;
77 	struct hlist_node *n;
78 	HLIST_HEAD(list);
79 
80 	down_write(&crypto_alg_sem);
81 	hlist_for_each_entry_safe(inst, n, &tmpl->dead, list) {
82 		if (refcount_read(&inst->alg.cra_refcnt) != -1)
83 			continue;
84 		hlist_del(&inst->list);
85 		hlist_add_head(&inst->list, &list);
86 	}
87 	up_write(&crypto_alg_sem);
88 
89 	hlist_for_each_entry_safe(inst, n, &list, list)
90 		crypto_free_instance(inst);
91 }
92 
93 static void crypto_destroy_instance(struct crypto_alg *alg)
94 {
95 	struct crypto_instance *inst = container_of(alg,
96 						    struct crypto_instance,
97 						    alg);
98 	struct crypto_template *tmpl = inst->tmpl;
99 
100 	refcount_set(&alg->cra_refcnt, -1);
101 	schedule_work(&tmpl->free_work);
102 }
103 
104 /*
105  * This function adds a spawn to the list secondary_spawns which
106  * will be used at the end of crypto_remove_spawns to unregister
107  * instances, unless the spawn happens to be one that is depended
108  * on by the new algorithm (nalg in crypto_remove_spawns).
109  *
110  * This function is also responsible for resurrecting any algorithms
111  * in the dependency chain of nalg by unsetting n->dead.
112  */
113 static struct list_head *crypto_more_spawns(struct crypto_alg *alg,
114 					    struct list_head *stack,
115 					    struct list_head *top,
116 					    struct list_head *secondary_spawns)
117 {
118 	struct crypto_spawn *spawn, *n;
119 
120 	spawn = list_first_entry_or_null(stack, struct crypto_spawn, list);
121 	if (!spawn)
122 		return NULL;
123 
124 	n = list_prev_entry(spawn, list);
125 	list_move(&spawn->list, secondary_spawns);
126 
127 	if (list_is_last(&n->list, stack))
128 		return top;
129 
130 	n = list_next_entry(n, list);
131 	if (!spawn->dead)
132 		n->dead = false;
133 
134 	return &n->inst->alg.cra_users;
135 }
136 
137 static void crypto_remove_instance(struct crypto_instance *inst,
138 				   struct list_head *list)
139 {
140 	struct crypto_template *tmpl = inst->tmpl;
141 
142 	if (crypto_is_dead(&inst->alg))
143 		return;
144 
145 	inst->alg.cra_flags |= CRYPTO_ALG_DEAD;
146 
147 	if (!tmpl)
148 		return;
149 
150 	list_del_init(&inst->alg.cra_list);
151 	hlist_del(&inst->list);
152 	hlist_add_head(&inst->list, &tmpl->dead);
153 
154 	BUG_ON(!list_empty(&inst->alg.cra_users));
155 
156 	crypto_alg_put(&inst->alg);
157 }
158 
159 /*
160  * Given an algorithm alg, remove all algorithms that depend on it
161  * through spawns.  If nalg is not null, then exempt any algorithms
162  * that is depended on by nalg.  This is useful when nalg itself
163  * depends on alg.
164  */
165 void crypto_remove_spawns(struct crypto_alg *alg, struct list_head *list,
166 			  struct crypto_alg *nalg)
167 {
168 	u32 new_type = (nalg ?: alg)->cra_flags;
169 	struct crypto_spawn *spawn, *n;
170 	LIST_HEAD(secondary_spawns);
171 	struct list_head *spawns;
172 	LIST_HEAD(stack);
173 	LIST_HEAD(top);
174 
175 	spawns = &alg->cra_users;
176 	list_for_each_entry_safe(spawn, n, spawns, list) {
177 		if ((spawn->alg->cra_flags ^ new_type) & spawn->mask)
178 			continue;
179 
180 		list_move(&spawn->list, &top);
181 	}
182 
183 	/*
184 	 * Perform a depth-first walk starting from alg through
185 	 * the cra_users tree.  The list stack records the path
186 	 * from alg to the current spawn.
187 	 */
188 	spawns = &top;
189 	do {
190 		while (!list_empty(spawns)) {
191 			struct crypto_instance *inst;
192 
193 			spawn = list_first_entry(spawns, struct crypto_spawn,
194 						 list);
195 			inst = spawn->inst;
196 
197 			list_move(&spawn->list, &stack);
198 			spawn->dead = !spawn->registered || &inst->alg != nalg;
199 
200 			if (!spawn->registered)
201 				break;
202 
203 			BUG_ON(&inst->alg == alg);
204 
205 			if (&inst->alg == nalg)
206 				break;
207 
208 			spawns = &inst->alg.cra_users;
209 
210 			/*
211 			 * Even if spawn->registered is true, the
212 			 * instance itself may still be unregistered.
213 			 * This is because it may have failed during
214 			 * registration.  Therefore we still need to
215 			 * make the following test.
216 			 *
217 			 * We may encounter an unregistered instance here, since
218 			 * an instance's spawns are set up prior to the instance
219 			 * being registered.  An unregistered instance will have
220 			 * NULL ->cra_users.next, since ->cra_users isn't
221 			 * properly initialized until registration.  But an
222 			 * unregistered instance cannot have any users, so treat
223 			 * it the same as ->cra_users being empty.
224 			 */
225 			if (spawns->next == NULL)
226 				break;
227 		}
228 	} while ((spawns = crypto_more_spawns(alg, &stack, &top,
229 					      &secondary_spawns)));
230 
231 	/*
232 	 * Remove all instances that are marked as dead.  Also
233 	 * complete the resurrection of the others by moving them
234 	 * back to the cra_users list.
235 	 */
236 	list_for_each_entry_safe(spawn, n, &secondary_spawns, list) {
237 		if (!spawn->dead)
238 			list_move(&spawn->list, &spawn->alg->cra_users);
239 		else if (spawn->registered)
240 			crypto_remove_instance(spawn->inst, list);
241 	}
242 }
243 EXPORT_SYMBOL_GPL(crypto_remove_spawns);
244 
245 static void crypto_alg_finish_registration(struct crypto_alg *alg,
246 					   struct list_head *algs_to_put)
247 {
248 	struct crypto_alg *q;
249 
250 	list_for_each_entry(q, &crypto_alg_list, cra_list) {
251 		if (q == alg)
252 			continue;
253 
254 		if (crypto_is_moribund(q))
255 			continue;
256 
257 		if (crypto_is_larval(q))
258 			continue;
259 
260 		if (strcmp(alg->cra_name, q->cra_name))
261 			continue;
262 
263 		if (strcmp(alg->cra_driver_name, q->cra_driver_name) &&
264 		    q->cra_priority > alg->cra_priority)
265 			continue;
266 
267 		crypto_remove_spawns(q, algs_to_put, alg);
268 	}
269 
270 	crypto_notify(CRYPTO_MSG_ALG_LOADED, alg);
271 }
272 
273 static struct crypto_larval *crypto_alloc_test_larval(struct crypto_alg *alg)
274 {
275 	struct crypto_larval *larval;
276 
277 	if (!IS_ENABLED(CONFIG_CRYPTO_MANAGER) ||
278 	    IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) ||
279 	    (alg->cra_flags & CRYPTO_ALG_INTERNAL))
280 		return NULL; /* No self-test needed */
281 
282 	larval = crypto_larval_alloc(alg->cra_name,
283 				     alg->cra_flags | CRYPTO_ALG_TESTED, 0);
284 	if (IS_ERR(larval))
285 		return larval;
286 
287 	larval->adult = crypto_mod_get(alg);
288 	if (!larval->adult) {
289 		kfree(larval);
290 		return ERR_PTR(-ENOENT);
291 	}
292 
293 	refcount_set(&larval->alg.cra_refcnt, 1);
294 	memcpy(larval->alg.cra_driver_name, alg->cra_driver_name,
295 	       CRYPTO_MAX_ALG_NAME);
296 	larval->alg.cra_priority = alg->cra_priority;
297 
298 	return larval;
299 }
300 
301 static struct crypto_larval *
302 __crypto_register_alg(struct crypto_alg *alg, struct list_head *algs_to_put)
303 {
304 	struct crypto_alg *q;
305 	struct crypto_larval *larval;
306 	int ret = -EAGAIN;
307 
308 	if (crypto_is_dead(alg))
309 		goto err;
310 
311 	INIT_LIST_HEAD(&alg->cra_users);
312 
313 	ret = -EEXIST;
314 
315 	list_for_each_entry(q, &crypto_alg_list, cra_list) {
316 		if (q == alg)
317 			goto err;
318 
319 		if (crypto_is_moribund(q))
320 			continue;
321 
322 		if (crypto_is_larval(q)) {
323 			if (!strcmp(alg->cra_driver_name, q->cra_driver_name))
324 				goto err;
325 			continue;
326 		}
327 
328 		if (!strcmp(q->cra_driver_name, alg->cra_name) ||
329 		    !strcmp(q->cra_driver_name, alg->cra_driver_name) ||
330 		    !strcmp(q->cra_name, alg->cra_driver_name))
331 			goto err;
332 	}
333 
334 	larval = crypto_alloc_test_larval(alg);
335 	if (IS_ERR(larval))
336 		goto out;
337 
338 	list_add(&alg->cra_list, &crypto_alg_list);
339 
340 	if (larval) {
341 		/* No cheating! */
342 		alg->cra_flags &= ~CRYPTO_ALG_TESTED;
343 
344 		list_add(&larval->alg.cra_list, &crypto_alg_list);
345 	} else {
346 		alg->cra_flags |= CRYPTO_ALG_TESTED;
347 		crypto_alg_finish_registration(alg, algs_to_put);
348 	}
349 
350 out:
351 	return larval;
352 
353 err:
354 	larval = ERR_PTR(ret);
355 	goto out;
356 }
357 
358 void crypto_alg_tested(const char *name, int err)
359 {
360 	struct crypto_larval *test;
361 	struct crypto_alg *alg;
362 	struct crypto_alg *q;
363 	LIST_HEAD(list);
364 
365 	down_write(&crypto_alg_sem);
366 	list_for_each_entry(q, &crypto_alg_list, cra_list) {
367 		if (crypto_is_moribund(q) || !crypto_is_larval(q))
368 			continue;
369 
370 		test = (struct crypto_larval *)q;
371 
372 		if (!strcmp(q->cra_driver_name, name))
373 			goto found;
374 	}
375 
376 	pr_err("alg: Unexpected test result for %s: %d\n", name, err);
377 	up_write(&crypto_alg_sem);
378 	return;
379 
380 found:
381 	q->cra_flags |= CRYPTO_ALG_DEAD;
382 	alg = test->adult;
383 
384 	if (crypto_is_dead(alg))
385 		goto complete;
386 
387 	if (err == -ECANCELED)
388 		alg->cra_flags |= CRYPTO_ALG_FIPS_INTERNAL;
389 	else if (err)
390 		goto complete;
391 	else
392 		alg->cra_flags &= ~CRYPTO_ALG_FIPS_INTERNAL;
393 
394 	alg->cra_flags |= CRYPTO_ALG_TESTED;
395 
396 	crypto_alg_finish_registration(alg, &list);
397 
398 complete:
399 	list_del_init(&test->alg.cra_list);
400 	complete_all(&test->completion);
401 
402 	up_write(&crypto_alg_sem);
403 
404 	crypto_alg_put(&test->alg);
405 	crypto_remove_final(&list);
406 }
407 EXPORT_SYMBOL_GPL(crypto_alg_tested);
408 
409 void crypto_remove_final(struct list_head *list)
410 {
411 	struct crypto_alg *alg;
412 	struct crypto_alg *n;
413 
414 	list_for_each_entry_safe(alg, n, list, cra_list) {
415 		list_del_init(&alg->cra_list);
416 		crypto_alg_put(alg);
417 	}
418 }
419 EXPORT_SYMBOL_GPL(crypto_remove_final);
420 
421 static void crypto_free_alg(struct crypto_alg *alg)
422 {
423 	unsigned int algsize = alg->cra_type->algsize;
424 	u8 *p = (u8 *)alg - algsize;
425 
426 	crypto_destroy_alg(alg);
427 	kfree(p);
428 }
429 
430 int crypto_register_alg(struct crypto_alg *alg)
431 {
432 	struct crypto_larval *larval;
433 	bool test_started = false;
434 	LIST_HEAD(algs_to_put);
435 	int err;
436 
437 	alg->cra_flags &= ~CRYPTO_ALG_DEAD;
438 	err = crypto_check_alg(alg);
439 	if (err)
440 		return err;
441 
442 	if (alg->cra_flags & CRYPTO_ALG_DUP_FIRST &&
443 	    !WARN_ON_ONCE(alg->cra_destroy)) {
444 		unsigned int algsize = alg->cra_type->algsize;
445 		u8 *p = (u8 *)alg - algsize;
446 
447 		p = kmemdup(p, algsize + sizeof(*alg), GFP_KERNEL);
448 		if (!p)
449 			return -ENOMEM;
450 
451 		alg = (void *)(p + algsize);
452 		alg->cra_destroy = crypto_free_alg;
453 	}
454 
455 	down_write(&crypto_alg_sem);
456 	larval = __crypto_register_alg(alg, &algs_to_put);
457 	if (!IS_ERR_OR_NULL(larval)) {
458 		test_started = crypto_boot_test_finished();
459 		larval->test_started = test_started;
460 	}
461 	up_write(&crypto_alg_sem);
462 
463 	if (IS_ERR(larval)) {
464 		crypto_alg_put(alg);
465 		return PTR_ERR(larval);
466 	}
467 
468 	if (test_started)
469 		crypto_schedule_test(larval);
470 	else
471 		crypto_remove_final(&algs_to_put);
472 
473 	return 0;
474 }
475 EXPORT_SYMBOL_GPL(crypto_register_alg);
476 
477 static int crypto_remove_alg(struct crypto_alg *alg, struct list_head *list)
478 {
479 	if (unlikely(list_empty(&alg->cra_list)))
480 		return -ENOENT;
481 
482 	alg->cra_flags |= CRYPTO_ALG_DEAD;
483 
484 	list_del_init(&alg->cra_list);
485 	crypto_remove_spawns(alg, list, NULL);
486 
487 	return 0;
488 }
489 
490 void crypto_unregister_alg(struct crypto_alg *alg)
491 {
492 	int ret;
493 	LIST_HEAD(list);
494 
495 	down_write(&crypto_alg_sem);
496 	ret = crypto_remove_alg(alg, &list);
497 	up_write(&crypto_alg_sem);
498 
499 	if (WARN(ret, "Algorithm %s is not registered", alg->cra_driver_name))
500 		return;
501 
502 	WARN_ON(!alg->cra_destroy && refcount_read(&alg->cra_refcnt) != 1);
503 
504 	list_add(&alg->cra_list, &list);
505 	crypto_remove_final(&list);
506 }
507 EXPORT_SYMBOL_GPL(crypto_unregister_alg);
508 
509 int crypto_register_algs(struct crypto_alg *algs, int count)
510 {
511 	int i, ret;
512 
513 	for (i = 0; i < count; i++) {
514 		ret = crypto_register_alg(&algs[i]);
515 		if (ret)
516 			goto err;
517 	}
518 
519 	return 0;
520 
521 err:
522 	for (--i; i >= 0; --i)
523 		crypto_unregister_alg(&algs[i]);
524 
525 	return ret;
526 }
527 EXPORT_SYMBOL_GPL(crypto_register_algs);
528 
529 void crypto_unregister_algs(struct crypto_alg *algs, int count)
530 {
531 	int i;
532 
533 	for (i = 0; i < count; i++)
534 		crypto_unregister_alg(&algs[i]);
535 }
536 EXPORT_SYMBOL_GPL(crypto_unregister_algs);
537 
538 int crypto_register_template(struct crypto_template *tmpl)
539 {
540 	struct crypto_template *q;
541 	int err = -EEXIST;
542 
543 	INIT_WORK(&tmpl->free_work, crypto_destroy_instance_workfn);
544 
545 	down_write(&crypto_alg_sem);
546 
547 	crypto_check_module_sig(tmpl->module);
548 
549 	list_for_each_entry(q, &crypto_template_list, list) {
550 		if (q == tmpl)
551 			goto out;
552 	}
553 
554 	list_add(&tmpl->list, &crypto_template_list);
555 	err = 0;
556 out:
557 	up_write(&crypto_alg_sem);
558 	return err;
559 }
560 EXPORT_SYMBOL_GPL(crypto_register_template);
561 
562 int crypto_register_templates(struct crypto_template *tmpls, int count)
563 {
564 	int i, err;
565 
566 	for (i = 0; i < count; i++) {
567 		err = crypto_register_template(&tmpls[i]);
568 		if (err)
569 			goto out;
570 	}
571 	return 0;
572 
573 out:
574 	for (--i; i >= 0; --i)
575 		crypto_unregister_template(&tmpls[i]);
576 	return err;
577 }
578 EXPORT_SYMBOL_GPL(crypto_register_templates);
579 
580 void crypto_unregister_template(struct crypto_template *tmpl)
581 {
582 	struct crypto_instance *inst;
583 	struct hlist_node *n;
584 	struct hlist_head *list;
585 	LIST_HEAD(users);
586 
587 	down_write(&crypto_alg_sem);
588 
589 	BUG_ON(list_empty(&tmpl->list));
590 	list_del_init(&tmpl->list);
591 
592 	list = &tmpl->instances;
593 	hlist_for_each_entry(inst, list, list) {
594 		int err = crypto_remove_alg(&inst->alg, &users);
595 
596 		BUG_ON(err);
597 	}
598 
599 	up_write(&crypto_alg_sem);
600 
601 	hlist_for_each_entry_safe(inst, n, list, list) {
602 		BUG_ON(refcount_read(&inst->alg.cra_refcnt) != 1);
603 		crypto_free_instance(inst);
604 	}
605 	crypto_remove_final(&users);
606 
607 	flush_work(&tmpl->free_work);
608 }
609 EXPORT_SYMBOL_GPL(crypto_unregister_template);
610 
611 void crypto_unregister_templates(struct crypto_template *tmpls, int count)
612 {
613 	int i;
614 
615 	for (i = count - 1; i >= 0; --i)
616 		crypto_unregister_template(&tmpls[i]);
617 }
618 EXPORT_SYMBOL_GPL(crypto_unregister_templates);
619 
620 static struct crypto_template *__crypto_lookup_template(const char *name)
621 {
622 	struct crypto_template *q, *tmpl = NULL;
623 
624 	down_read(&crypto_alg_sem);
625 	list_for_each_entry(q, &crypto_template_list, list) {
626 		if (strcmp(q->name, name))
627 			continue;
628 		if (unlikely(!crypto_tmpl_get(q)))
629 			continue;
630 
631 		tmpl = q;
632 		break;
633 	}
634 	up_read(&crypto_alg_sem);
635 
636 	return tmpl;
637 }
638 
639 struct crypto_template *crypto_lookup_template(const char *name)
640 {
641 	return try_then_request_module(__crypto_lookup_template(name),
642 				       "crypto-%s", name);
643 }
644 EXPORT_SYMBOL_GPL(crypto_lookup_template);
645 
646 int crypto_register_instance(struct crypto_template *tmpl,
647 			     struct crypto_instance *inst)
648 {
649 	struct crypto_larval *larval;
650 	struct crypto_spawn *spawn;
651 	u32 fips_internal = 0;
652 	LIST_HEAD(algs_to_put);
653 	int err;
654 
655 	err = crypto_check_alg(&inst->alg);
656 	if (err)
657 		return err;
658 
659 	inst->alg.cra_module = tmpl->module;
660 	inst->alg.cra_flags |= CRYPTO_ALG_INSTANCE;
661 	inst->alg.cra_destroy = crypto_destroy_instance;
662 
663 	down_write(&crypto_alg_sem);
664 
665 	larval = ERR_PTR(-EAGAIN);
666 	for (spawn = inst->spawns; spawn;) {
667 		struct crypto_spawn *next;
668 
669 		if (spawn->dead)
670 			goto unlock;
671 
672 		next = spawn->next;
673 		spawn->inst = inst;
674 		spawn->registered = true;
675 
676 		fips_internal |= spawn->alg->cra_flags;
677 
678 		crypto_mod_put(spawn->alg);
679 
680 		spawn = next;
681 	}
682 
683 	inst->alg.cra_flags |= (fips_internal & CRYPTO_ALG_FIPS_INTERNAL);
684 
685 	larval = __crypto_register_alg(&inst->alg, &algs_to_put);
686 	if (IS_ERR(larval))
687 		goto unlock;
688 	else if (larval)
689 		larval->test_started = true;
690 
691 	hlist_add_head(&inst->list, &tmpl->instances);
692 	inst->tmpl = tmpl;
693 
694 unlock:
695 	up_write(&crypto_alg_sem);
696 
697 	if (IS_ERR(larval))
698 		return PTR_ERR(larval);
699 
700 	if (larval)
701 		crypto_schedule_test(larval);
702 	else
703 		crypto_remove_final(&algs_to_put);
704 
705 	return 0;
706 }
707 EXPORT_SYMBOL_GPL(crypto_register_instance);
708 
709 void crypto_unregister_instance(struct crypto_instance *inst)
710 {
711 	LIST_HEAD(list);
712 
713 	down_write(&crypto_alg_sem);
714 
715 	crypto_remove_spawns(&inst->alg, &list, NULL);
716 	crypto_remove_instance(inst, &list);
717 
718 	up_write(&crypto_alg_sem);
719 
720 	crypto_remove_final(&list);
721 }
722 EXPORT_SYMBOL_GPL(crypto_unregister_instance);
723 
724 int crypto_grab_spawn(struct crypto_spawn *spawn, struct crypto_instance *inst,
725 		      const char *name, u32 type, u32 mask)
726 {
727 	struct crypto_alg *alg;
728 	int err = -EAGAIN;
729 
730 	if (WARN_ON_ONCE(inst == NULL))
731 		return -EINVAL;
732 
733 	/* Allow the result of crypto_attr_alg_name() to be passed directly */
734 	if (IS_ERR(name))
735 		return PTR_ERR(name);
736 
737 	alg = crypto_find_alg(name, spawn->frontend,
738 			      type | CRYPTO_ALG_FIPS_INTERNAL, mask);
739 	if (IS_ERR(alg))
740 		return PTR_ERR(alg);
741 
742 	down_write(&crypto_alg_sem);
743 	if (!crypto_is_moribund(alg)) {
744 		list_add(&spawn->list, &alg->cra_users);
745 		spawn->alg = alg;
746 		spawn->mask = mask;
747 		spawn->next = inst->spawns;
748 		inst->spawns = spawn;
749 		inst->alg.cra_flags |=
750 			(alg->cra_flags & CRYPTO_ALG_INHERITED_FLAGS);
751 		err = 0;
752 	}
753 	up_write(&crypto_alg_sem);
754 	if (err)
755 		crypto_mod_put(alg);
756 	return err;
757 }
758 EXPORT_SYMBOL_GPL(crypto_grab_spawn);
759 
760 void crypto_drop_spawn(struct crypto_spawn *spawn)
761 {
762 	if (!spawn->alg) /* not yet initialized? */
763 		return;
764 
765 	down_write(&crypto_alg_sem);
766 	if (!spawn->dead)
767 		list_del(&spawn->list);
768 	up_write(&crypto_alg_sem);
769 
770 	if (!spawn->registered)
771 		crypto_mod_put(spawn->alg);
772 }
773 EXPORT_SYMBOL_GPL(crypto_drop_spawn);
774 
775 static struct crypto_alg *crypto_spawn_alg(struct crypto_spawn *spawn)
776 {
777 	struct crypto_alg *alg = ERR_PTR(-EAGAIN);
778 	struct crypto_alg *target;
779 	bool shoot = false;
780 
781 	down_read(&crypto_alg_sem);
782 	if (!spawn->dead) {
783 		alg = spawn->alg;
784 		if (!crypto_mod_get(alg)) {
785 			target = crypto_alg_get(alg);
786 			shoot = true;
787 			alg = ERR_PTR(-EAGAIN);
788 		}
789 	}
790 	up_read(&crypto_alg_sem);
791 
792 	if (shoot) {
793 		crypto_shoot_alg(target);
794 		crypto_alg_put(target);
795 	}
796 
797 	return alg;
798 }
799 
800 struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type,
801 				    u32 mask)
802 {
803 	struct crypto_alg *alg;
804 	struct crypto_tfm *tfm;
805 
806 	alg = crypto_spawn_alg(spawn);
807 	if (IS_ERR(alg))
808 		return ERR_CAST(alg);
809 
810 	tfm = ERR_PTR(-EINVAL);
811 	if (unlikely((alg->cra_flags ^ type) & mask))
812 		goto out_put_alg;
813 
814 	tfm = __crypto_alloc_tfm(alg, type, mask);
815 	if (IS_ERR(tfm))
816 		goto out_put_alg;
817 
818 	return tfm;
819 
820 out_put_alg:
821 	crypto_mod_put(alg);
822 	return tfm;
823 }
824 EXPORT_SYMBOL_GPL(crypto_spawn_tfm);
825 
826 void *crypto_spawn_tfm2(struct crypto_spawn *spawn)
827 {
828 	struct crypto_alg *alg;
829 	struct crypto_tfm *tfm;
830 
831 	alg = crypto_spawn_alg(spawn);
832 	if (IS_ERR(alg))
833 		return ERR_CAST(alg);
834 
835 	tfm = crypto_create_tfm(alg, spawn->frontend);
836 	if (IS_ERR(tfm))
837 		goto out_put_alg;
838 
839 	return tfm;
840 
841 out_put_alg:
842 	crypto_mod_put(alg);
843 	return tfm;
844 }
845 EXPORT_SYMBOL_GPL(crypto_spawn_tfm2);
846 
847 int crypto_register_notifier(struct notifier_block *nb)
848 {
849 	return blocking_notifier_chain_register(&crypto_chain, nb);
850 }
851 EXPORT_SYMBOL_GPL(crypto_register_notifier);
852 
853 int crypto_unregister_notifier(struct notifier_block *nb)
854 {
855 	return blocking_notifier_chain_unregister(&crypto_chain, nb);
856 }
857 EXPORT_SYMBOL_GPL(crypto_unregister_notifier);
858 
859 struct crypto_attr_type *crypto_get_attr_type(struct rtattr **tb)
860 {
861 	struct rtattr *rta = tb[0];
862 	struct crypto_attr_type *algt;
863 
864 	if (!rta)
865 		return ERR_PTR(-ENOENT);
866 	if (RTA_PAYLOAD(rta) < sizeof(*algt))
867 		return ERR_PTR(-EINVAL);
868 	if (rta->rta_type != CRYPTOA_TYPE)
869 		return ERR_PTR(-EINVAL);
870 
871 	algt = RTA_DATA(rta);
872 
873 	return algt;
874 }
875 EXPORT_SYMBOL_GPL(crypto_get_attr_type);
876 
877 /**
878  * crypto_check_attr_type() - check algorithm type and compute inherited mask
879  * @tb: the template parameters
880  * @type: the algorithm type the template would be instantiated as
881  * @mask_ret: (output) the mask that should be passed to crypto_grab_*()
882  *	      to restrict the flags of any inner algorithms
883  *
884  * Validate that the algorithm type the user requested is compatible with the
885  * one the template would actually be instantiated as.  E.g., if the user is
886  * doing crypto_alloc_shash("cbc(aes)", ...), this would return an error because
887  * the "cbc" template creates an "skcipher" algorithm, not an "shash" algorithm.
888  *
889  * Also compute the mask to use to restrict the flags of any inner algorithms.
890  *
891  * Return: 0 on success; -errno on failure
892  */
893 int crypto_check_attr_type(struct rtattr **tb, u32 type, u32 *mask_ret)
894 {
895 	struct crypto_attr_type *algt;
896 
897 	algt = crypto_get_attr_type(tb);
898 	if (IS_ERR(algt))
899 		return PTR_ERR(algt);
900 
901 	if ((algt->type ^ type) & algt->mask)
902 		return -EINVAL;
903 
904 	*mask_ret = crypto_algt_inherited_mask(algt);
905 	return 0;
906 }
907 EXPORT_SYMBOL_GPL(crypto_check_attr_type);
908 
909 const char *crypto_attr_alg_name(struct rtattr *rta)
910 {
911 	struct crypto_attr_alg *alga;
912 
913 	if (!rta)
914 		return ERR_PTR(-ENOENT);
915 	if (RTA_PAYLOAD(rta) < sizeof(*alga))
916 		return ERR_PTR(-EINVAL);
917 	if (rta->rta_type != CRYPTOA_ALG)
918 		return ERR_PTR(-EINVAL);
919 
920 	alga = RTA_DATA(rta);
921 	alga->name[CRYPTO_MAX_ALG_NAME - 1] = 0;
922 
923 	return alga->name;
924 }
925 EXPORT_SYMBOL_GPL(crypto_attr_alg_name);
926 
927 int crypto_inst_setname(struct crypto_instance *inst, const char *name,
928 			struct crypto_alg *alg)
929 {
930 	if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME, "%s(%s)", name,
931 		     alg->cra_name) >= CRYPTO_MAX_ALG_NAME)
932 		return -ENAMETOOLONG;
933 
934 	if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s(%s)",
935 		     name, alg->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
936 		return -ENAMETOOLONG;
937 
938 	return 0;
939 }
940 EXPORT_SYMBOL_GPL(crypto_inst_setname);
941 
942 void crypto_init_queue(struct crypto_queue *queue, unsigned int max_qlen)
943 {
944 	INIT_LIST_HEAD(&queue->list);
945 	queue->backlog = &queue->list;
946 	queue->qlen = 0;
947 	queue->max_qlen = max_qlen;
948 }
949 EXPORT_SYMBOL_GPL(crypto_init_queue);
950 
951 int crypto_enqueue_request(struct crypto_queue *queue,
952 			   struct crypto_async_request *request)
953 {
954 	int err = -EINPROGRESS;
955 
956 	if (unlikely(queue->qlen >= queue->max_qlen)) {
957 		if (!(request->flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {
958 			err = -ENOSPC;
959 			goto out;
960 		}
961 		err = -EBUSY;
962 		if (queue->backlog == &queue->list)
963 			queue->backlog = &request->list;
964 	}
965 
966 	queue->qlen++;
967 	list_add_tail(&request->list, &queue->list);
968 
969 out:
970 	return err;
971 }
972 EXPORT_SYMBOL_GPL(crypto_enqueue_request);
973 
974 void crypto_enqueue_request_head(struct crypto_queue *queue,
975 				 struct crypto_async_request *request)
976 {
977 	if (unlikely(queue->qlen >= queue->max_qlen))
978 		queue->backlog = queue->backlog->prev;
979 
980 	queue->qlen++;
981 	list_add(&request->list, &queue->list);
982 }
983 EXPORT_SYMBOL_GPL(crypto_enqueue_request_head);
984 
985 struct crypto_async_request *crypto_dequeue_request(struct crypto_queue *queue)
986 {
987 	struct list_head *request;
988 
989 	if (unlikely(!queue->qlen))
990 		return NULL;
991 
992 	queue->qlen--;
993 
994 	if (queue->backlog != &queue->list)
995 		queue->backlog = queue->backlog->next;
996 
997 	request = queue->list.next;
998 	list_del_init(request);
999 
1000 	return list_entry(request, struct crypto_async_request, list);
1001 }
1002 EXPORT_SYMBOL_GPL(crypto_dequeue_request);
1003 
1004 static inline void crypto_inc_byte(u8 *a, unsigned int size)
1005 {
1006 	u8 *b = (a + size);
1007 	u8 c;
1008 
1009 	for (; size; size--) {
1010 		c = *--b + 1;
1011 		*b = c;
1012 		if (c)
1013 			break;
1014 	}
1015 }
1016 
1017 void crypto_inc(u8 *a, unsigned int size)
1018 {
1019 	__be32 *b = (__be32 *)(a + size);
1020 	u32 c;
1021 
1022 	if (IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) ||
1023 	    IS_ALIGNED((unsigned long)b, __alignof__(*b)))
1024 		for (; size >= 4; size -= 4) {
1025 			c = be32_to_cpu(*--b) + 1;
1026 			*b = cpu_to_be32(c);
1027 			if (likely(c))
1028 				return;
1029 		}
1030 
1031 	crypto_inc_byte(a, size);
1032 }
1033 EXPORT_SYMBOL_GPL(crypto_inc);
1034 
1035 unsigned int crypto_alg_extsize(struct crypto_alg *alg)
1036 {
1037 	return alg->cra_ctxsize +
1038 	       (alg->cra_alignmask & ~(crypto_tfm_ctx_alignment() - 1));
1039 }
1040 EXPORT_SYMBOL_GPL(crypto_alg_extsize);
1041 
1042 int crypto_type_has_alg(const char *name, const struct crypto_type *frontend,
1043 			u32 type, u32 mask)
1044 {
1045 	int ret = 0;
1046 	struct crypto_alg *alg = crypto_find_alg(name, frontend, type, mask);
1047 
1048 	if (!IS_ERR(alg)) {
1049 		crypto_mod_put(alg);
1050 		ret = 1;
1051 	}
1052 
1053 	return ret;
1054 }
1055 EXPORT_SYMBOL_GPL(crypto_type_has_alg);
1056 
1057 static void __init crypto_start_tests(void)
1058 {
1059 	if (!IS_BUILTIN(CONFIG_CRYPTO_ALGAPI))
1060 		return;
1061 
1062 	if (IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS))
1063 		return;
1064 
1065 	set_crypto_boot_test_finished();
1066 
1067 	for (;;) {
1068 		struct crypto_larval *larval = NULL;
1069 		struct crypto_alg *q;
1070 
1071 		down_write(&crypto_alg_sem);
1072 
1073 		list_for_each_entry(q, &crypto_alg_list, cra_list) {
1074 			struct crypto_larval *l;
1075 
1076 			if (!crypto_is_larval(q))
1077 				continue;
1078 
1079 			l = (void *)q;
1080 
1081 			if (!crypto_is_test_larval(l))
1082 				continue;
1083 
1084 			if (l->test_started)
1085 				continue;
1086 
1087 			l->test_started = true;
1088 			larval = l;
1089 			break;
1090 		}
1091 
1092 		up_write(&crypto_alg_sem);
1093 
1094 		if (!larval)
1095 			break;
1096 
1097 		crypto_schedule_test(larval);
1098 	}
1099 }
1100 
1101 static int __init crypto_algapi_init(void)
1102 {
1103 	crypto_init_proc();
1104 	crypto_start_tests();
1105 	return 0;
1106 }
1107 
1108 static void __exit crypto_algapi_exit(void)
1109 {
1110 	crypto_exit_proc();
1111 }
1112 
1113 /*
1114  * We run this at late_initcall so that all the built-in algorithms
1115  * have had a chance to register themselves first.
1116  */
1117 late_initcall(crypto_algapi_init);
1118 module_exit(crypto_algapi_exit);
1119 
1120 MODULE_LICENSE("GPL");
1121 MODULE_DESCRIPTION("Cryptographic algorithms API");
1122 MODULE_SOFTDEP("pre: cryptomgr");
1123