Lines Matching defs:alg

32 static int crypto_check_alg(struct crypto_alg *alg)
34 crypto_check_module_sig(alg->cra_module);
36 if (!alg->cra_name[0] || !alg->cra_driver_name[0])
39 if (alg->cra_alignmask & (alg->cra_alignmask + 1))
43 if (alg->cra_alignmask > MAX_ALGAPI_ALIGNMASK)
46 if (alg->cra_blocksize > MAX_ALGAPI_BLOCKSIZE)
49 /* Lower maximums for specific alg types. */
50 if (!alg->cra_type && (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
52 if (alg->cra_alignmask > MAX_CIPHER_ALIGNMASK)
55 if (alg->cra_blocksize > MAX_CIPHER_BLOCKSIZE)
59 if (alg->cra_priority < 0)
62 refcount_set(&alg->cra_refcnt, 1);
69 inst->alg.cra_type->free(inst);
82 static void crypto_destroy_instance(struct crypto_alg *alg)
84 struct crypto_instance *inst = container_of(alg,
86 alg);
101 static struct list_head *crypto_more_spawns(struct crypto_alg *alg,
122 return &n->inst->alg.cra_users;
130 if (crypto_is_dead(&inst->alg))
133 inst->alg.cra_flags |= CRYPTO_ALG_DEAD;
138 list_move(&inst->alg.cra_list, list);
140 inst->alg.cra_destroy = crypto_destroy_instance;
142 BUG_ON(!list_empty(&inst->alg.cra_users));
146 * Given an algorithm alg, remove all algorithms that depend on it
149 * depends on alg.
151 void crypto_remove_spawns(struct crypto_alg *alg, struct list_head *list,
154 u32 new_type = (nalg ?: alg)->cra_flags;
161 spawns = &alg->cra_users;
163 if ((spawn->alg->cra_flags ^ new_type) & spawn->mask)
170 * Perform a depth-first walk starting from alg through
172 * from alg to the current spawn.
184 spawn->dead = !spawn->registered || &inst->alg != nalg;
189 BUG_ON(&inst->alg == alg);
191 if (&inst->alg == nalg)
194 spawns = &inst->alg.cra_users;
214 } while ((spawns = crypto_more_spawns(alg, &stack, &top,
224 list_move(&spawn->list, &spawn->alg->cra_users);
231 static void crypto_alg_finish_registration(struct crypto_alg *alg,
237 if (q == alg)
246 if (strcmp(alg->cra_name, q->cra_name))
249 if (strcmp(alg->cra_driver_name, q->cra_driver_name) &&
250 q->cra_priority > alg->cra_priority)
253 crypto_remove_spawns(q, algs_to_put, alg);
256 crypto_notify(CRYPTO_MSG_ALG_LOADED, alg);
259 static struct crypto_larval *crypto_alloc_test_larval(struct crypto_alg *alg)
265 (alg->cra_flags & CRYPTO_ALG_INTERNAL))
268 larval = crypto_larval_alloc(alg->cra_name,
269 alg->cra_flags | CRYPTO_ALG_TESTED, 0);
273 larval->adult = crypto_mod_get(alg);
279 refcount_set(&larval->alg.cra_refcnt, 1);
280 memcpy(larval->alg.cra_driver_name, alg->cra_driver_name,
282 larval->alg.cra_priority = alg->cra_priority;
288 __crypto_register_alg(struct crypto_alg *alg, struct list_head *algs_to_put)
294 if (crypto_is_dead(alg))
297 INIT_LIST_HEAD(&alg->cra_users);
302 if (q == alg)
309 if (!strcmp(alg->cra_driver_name, q->cra_driver_name))
314 if (!strcmp(q->cra_driver_name, alg->cra_name) ||
315 !strcmp(q->cra_driver_name, alg->cra_driver_name) ||
316 !strcmp(q->cra_name, alg->cra_driver_name))
320 larval = crypto_alloc_test_larval(alg);
324 list_add(&alg->cra_list, &crypto_alg_list);
328 alg->cra_flags &= ~CRYPTO_ALG_TESTED;
330 list_add(&larval->alg.cra_list, &crypto_alg_list);
332 alg->cra_flags |= CRYPTO_ALG_TESTED;
333 crypto_alg_finish_registration(alg, algs_to_put);
347 struct crypto_alg *alg;
362 pr_err("alg: Unexpected test result for %s: %d\n", name, err);
368 alg = test->adult;
370 if (crypto_is_dead(alg))
374 alg->cra_flags |= CRYPTO_ALG_FIPS_INTERNAL;
378 alg->cra_flags &= ~CRYPTO_ALG_FIPS_INTERNAL;
380 alg->cra_flags |= CRYPTO_ALG_TESTED;
382 crypto_alg_finish_registration(alg, &list);
385 list_del_init(&test->alg.cra_list);
390 crypto_alg_put(&test->alg);
397 struct crypto_alg *alg;
400 list_for_each_entry_safe(alg, n, list, cra_list) {
401 list_del_init(&alg->cra_list);
402 crypto_alg_put(alg);
407 int crypto_register_alg(struct crypto_alg *alg)
414 alg->cra_flags &= ~CRYPTO_ALG_DEAD;
415 err = crypto_check_alg(alg);
420 larval = __crypto_register_alg(alg, &algs_to_put);
439 static int crypto_remove_alg(struct crypto_alg *alg, struct list_head *list)
441 if (unlikely(list_empty(&alg->cra_list)))
444 alg->cra_flags |= CRYPTO_ALG_DEAD;
446 list_del_init(&alg->cra_list);
447 crypto_remove_spawns(alg, list, NULL);
452 void crypto_unregister_alg(struct crypto_alg *alg)
458 ret = crypto_remove_alg(alg, &list);
461 if (WARN(ret, "Algorithm %s is not registered", alg->cra_driver_name))
464 if (WARN_ON(refcount_read(&alg->cra_refcnt) != 1))
467 if (alg->cra_destroy)
468 alg->cra_destroy(alg);
557 int err = crypto_remove_alg(&inst->alg, &users);
565 BUG_ON(refcount_read(&inst->alg.cra_refcnt) != 1);
616 err = crypto_check_alg(&inst->alg);
620 inst->alg.cra_module = tmpl->module;
621 inst->alg.cra_flags |= CRYPTO_ALG_INSTANCE;
636 fips_internal |= spawn->alg->cra_flags;
638 crypto_mod_put(spawn->alg);
643 inst->alg.cra_flags |= (fips_internal & CRYPTO_ALG_FIPS_INTERNAL);
645 larval = __crypto_register_alg(&inst->alg, &algs_to_put);
675 crypto_remove_spawns(&inst->alg, &list, NULL);
687 struct crypto_alg *alg;
697 alg = crypto_find_alg(name, spawn->frontend,
699 if (IS_ERR(alg))
700 return PTR_ERR(alg);
703 if (!crypto_is_moribund(alg)) {
704 list_add(&spawn->list, &alg->cra_users);
705 spawn->alg = alg;
709 inst->alg.cra_flags |=
710 (alg->cra_flags & CRYPTO_ALG_INHERITED_FLAGS);
715 crypto_mod_put(alg);
722 if (!spawn->alg) /* not yet initialized? */
731 crypto_mod_put(spawn->alg);
737 struct crypto_alg *alg = ERR_PTR(-EAGAIN);
743 alg = spawn->alg;
744 if (!crypto_mod_get(alg)) {
745 target = crypto_alg_get(alg);
747 alg = ERR_PTR(-EAGAIN);
757 return alg;
763 struct crypto_alg *alg;
766 alg = crypto_spawn_alg(spawn);
767 if (IS_ERR(alg))
768 return ERR_CAST(alg);
771 if (unlikely((alg->cra_flags ^ type) & mask))
774 tfm = __crypto_alloc_tfm(alg, type, mask);
781 crypto_mod_put(alg);
788 struct crypto_alg *alg;
791 alg = crypto_spawn_alg(spawn);
792 if (IS_ERR(alg))
793 return ERR_CAST(alg);
795 tfm = crypto_create_tfm(alg, spawn->frontend);
802 crypto_mod_put(alg);
888 struct crypto_alg *alg)
890 if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME, "%s(%s)", name,
891 alg->cra_name) >= CRYPTO_MAX_ALG_NAME)
894 if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s(%s)",
895 name, alg->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
995 unsigned int crypto_alg_extsize(struct crypto_alg *alg)
997 return alg->cra_ctxsize +
998 (alg->cra_alignmask & ~(crypto_tfm_ctx_alignment() - 1));
1006 struct crypto_alg *alg = crypto_find_alg(name, frontend, type, mask);
1008 if (!IS_ERR(alg)) {
1009 crypto_mod_put(alg);