Lines Matching refs:alg

38 static int crypto_check_alg(struct crypto_alg *alg)
40 crypto_check_module_sig(alg->cra_module);
42 if (!alg->cra_name[0] || !alg->cra_driver_name[0])
45 if (alg->cra_alignmask & (alg->cra_alignmask + 1))
49 if (alg->cra_alignmask > MAX_ALGAPI_ALIGNMASK)
52 if (alg->cra_blocksize > MAX_ALGAPI_BLOCKSIZE)
55 /* Lower maximums for specific alg types. */
56 if (!alg->cra_type && (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
58 if (alg->cra_alignmask > MAX_CIPHER_ALIGNMASK)
61 if (alg->cra_blocksize > MAX_CIPHER_BLOCKSIZE)
65 if (alg->cra_priority < 0)
68 refcount_set(&alg->cra_refcnt, 1);
75 inst->alg.cra_type->free(inst);
88 static void crypto_destroy_instance(struct crypto_alg *alg)
90 struct crypto_instance *inst = container_of(alg,
92 alg);
107 static struct list_head *crypto_more_spawns(struct crypto_alg *alg,
128 return &n->inst->alg.cra_users;
136 if (crypto_is_dead(&inst->alg))
139 inst->alg.cra_flags |= CRYPTO_ALG_DEAD;
144 list_move(&inst->alg.cra_list, list);
146 inst->alg.cra_destroy = crypto_destroy_instance;
148 BUG_ON(!list_empty(&inst->alg.cra_users));
152 * Given an algorithm alg, remove all algorithms that depend on it
155 * depends on alg.
157 void crypto_remove_spawns(struct crypto_alg *alg, struct list_head *list,
160 u32 new_type = (nalg ?: alg)->cra_flags;
167 spawns = &alg->cra_users;
169 if ((spawn->alg->cra_flags ^ new_type) & spawn->mask)
176 * Perform a depth-first walk starting from alg through
178 * from alg to the current spawn.
190 spawn->dead = !spawn->registered || &inst->alg != nalg;
195 BUG_ON(&inst->alg == alg);
197 if (&inst->alg == nalg)
200 spawns = &inst->alg.cra_users;
220 } while ((spawns = crypto_more_spawns(alg, &stack, &top,
230 list_move(&spawn->list, &spawn->alg->cra_users);
237 static void crypto_alg_finish_registration(struct crypto_alg *alg,
244 if (q == alg)
258 if (strcmp(alg->cra_name, q->cra_name) &&
259 strcmp(alg->cra_driver_name, q->cra_name))
264 if ((q->cra_flags ^ alg->cra_flags) & larval->mask)
267 if (fulfill_requests && crypto_mod_get(alg))
268 larval->adult = alg;
275 if (strcmp(alg->cra_name, q->cra_name))
278 if (strcmp(alg->cra_driver_name, q->cra_driver_name) &&
279 q->cra_priority > alg->cra_priority)
282 crypto_remove_spawns(q, algs_to_put, alg);
285 crypto_notify(CRYPTO_MSG_ALG_LOADED, alg);
288 static struct crypto_larval *crypto_alloc_test_larval(struct crypto_alg *alg)
294 (alg->cra_flags & CRYPTO_ALG_INTERNAL))
297 larval = crypto_larval_alloc(alg->cra_name,
298 alg->cra_flags | CRYPTO_ALG_TESTED, 0);
302 larval->adult = crypto_mod_get(alg);
308 refcount_set(&larval->alg.cra_refcnt, 1);
309 memcpy(larval->alg.cra_driver_name, alg->cra_driver_name,
311 larval->alg.cra_priority = alg->cra_priority;
317 __crypto_register_alg(struct crypto_alg *alg, struct list_head *algs_to_put)
323 if (crypto_is_dead(alg))
326 INIT_LIST_HEAD(&alg->cra_users);
331 if (q == alg)
338 if (!strcmp(alg->cra_driver_name, q->cra_driver_name))
343 if (!strcmp(q->cra_driver_name, alg->cra_name) ||
344 !strcmp(q->cra_driver_name, alg->cra_driver_name) ||
345 !strcmp(q->cra_name, alg->cra_driver_name))
349 larval = crypto_alloc_test_larval(alg);
353 list_add(&alg->cra_list, &crypto_alg_list);
357 alg->cra_flags &= ~CRYPTO_ALG_TESTED;
359 list_add(&larval->alg.cra_list, &crypto_alg_list);
361 alg->cra_flags |= CRYPTO_ALG_TESTED;
362 crypto_alg_finish_registration(alg, true, algs_to_put);
376 struct crypto_alg *alg;
392 pr_err("alg: Unexpected test result for %s: %d\n", name, err);
397 alg = test->adult;
399 if (list_empty(&alg->cra_list))
403 alg->cra_flags |= CRYPTO_ALG_FIPS_INTERNAL;
407 alg->cra_flags &= ~CRYPTO_ALG_FIPS_INTERNAL;
409 alg->cra_flags |= CRYPTO_ALG_TESTED;
420 if (strcmp(alg->cra_name, q->cra_name))
423 if (q->cra_priority > alg->cra_priority) {
429 crypto_alg_finish_registration(alg, best, &list);
443 struct crypto_alg *alg;
446 list_for_each_entry_safe(alg, n, list, cra_list) {
447 list_del_init(&alg->cra_list);
448 crypto_alg_put(alg);
453 int crypto_register_alg(struct crypto_alg *alg)
460 alg->cra_flags &= ~CRYPTO_ALG_DEAD;
461 err = crypto_check_alg(alg);
466 larval = __crypto_register_alg(alg, &algs_to_put);
482 static int crypto_remove_alg(struct crypto_alg *alg, struct list_head *list)
484 if (unlikely(list_empty(&alg->cra_list)))
487 alg->cra_flags |= CRYPTO_ALG_DEAD;
489 list_del_init(&alg->cra_list);
490 crypto_remove_spawns(alg, list, NULL);
495 void crypto_unregister_alg(struct crypto_alg *alg)
501 ret = crypto_remove_alg(alg, &list);
504 if (WARN(ret, "Algorithm %s is not registered", alg->cra_driver_name))
507 if (WARN_ON(refcount_read(&alg->cra_refcnt) != 1))
510 if (alg->cra_destroy)
511 alg->cra_destroy(alg);
600 int err = crypto_remove_alg(&inst->alg, &users);
608 BUG_ON(refcount_read(&inst->alg.cra_refcnt) != 1);
659 err = crypto_check_alg(&inst->alg);
663 inst->alg.cra_module = tmpl->module;
664 inst->alg.cra_flags |= CRYPTO_ALG_INSTANCE;
679 fips_internal |= spawn->alg->cra_flags;
681 crypto_mod_put(spawn->alg);
686 inst->alg.cra_flags |= (fips_internal & CRYPTO_ALG_FIPS_INTERNAL);
688 larval = __crypto_register_alg(&inst->alg, &algs_to_put);
715 crypto_remove_spawns(&inst->alg, &list, NULL);
727 struct crypto_alg *alg;
737 alg = crypto_find_alg(name, spawn->frontend,
739 if (IS_ERR(alg))
740 return PTR_ERR(alg);
743 if (!crypto_is_moribund(alg)) {
744 list_add(&spawn->list, &alg->cra_users);
745 spawn->alg = alg;
749 inst->alg.cra_flags |=
750 (alg->cra_flags & CRYPTO_ALG_INHERITED_FLAGS);
755 crypto_mod_put(alg);
762 if (!spawn->alg) /* not yet initialized? */
771 crypto_mod_put(spawn->alg);
777 struct crypto_alg *alg = ERR_PTR(-EAGAIN);
783 alg = spawn->alg;
784 if (!crypto_mod_get(alg)) {
785 target = crypto_alg_get(alg);
787 alg = ERR_PTR(-EAGAIN);
797 return alg;
803 struct crypto_alg *alg;
806 alg = crypto_spawn_alg(spawn);
807 if (IS_ERR(alg))
808 return ERR_CAST(alg);
811 if (unlikely((alg->cra_flags ^ type) & mask))
814 tfm = __crypto_alloc_tfm(alg, type, mask);
821 crypto_mod_put(alg);
828 struct crypto_alg *alg;
831 alg = crypto_spawn_alg(spawn);
832 if (IS_ERR(alg))
833 return ERR_CAST(alg);
835 tfm = crypto_create_tfm(alg, spawn->frontend);
842 crypto_mod_put(alg);
928 struct crypto_alg *alg)
930 if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME, "%s(%s)", name,
931 alg->cra_name) >= CRYPTO_MAX_ALG_NAME)
934 if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s(%s)",
935 name, alg->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
1035 unsigned int crypto_alg_extsize(struct crypto_alg *alg)
1037 return alg->cra_ctxsize +
1038 (alg->cra_alignmask & ~(crypto_tfm_ctx_alignment() - 1));
1046 struct crypto_alg *alg = crypto_find_alg(name, frontend, type, mask);
1048 if (!IS_ERR(alg)) {
1049 crypto_mod_put(alg);