}
}
-struct crypto_tfm *crypto_alloc_tfm(const char *name, u32 flags)
+struct crypto_tfm *crypto_alloc_tfm2(const char *name, u32 flags,
+ int nomodload)
{
struct crypto_tfm *tfm = NULL;
struct crypto_alg *alg;
- alg = crypto_alg_mod_lookup(name);
+ if (!nomodload) {
+ alg = crypto_alg_mod_lookup(name);
+ }
+ else {
+ alg = crypto_alg_lookup(name);
+ }
+
if (alg == NULL)
goto out;
return tfm;
}
+struct crypto_tfm *crypto_alloc_tfm(const char *name, u32 flags)
+{
+ return crypto_alloc_tfm2(name, flags, 0);
+}
+
void crypto_free_tfm(struct crypto_tfm *tfm)
{
+ struct crypto_alg *alg = tfm->__crt_alg;
+ int size = sizeof(*tfm) + alg->cra_ctxsize;
+
crypto_exit_ops(tfm);
- crypto_alg_put(tfm->__crt_alg);
+ crypto_alg_put(alg);
+ memset(tfm, 0, size);
kfree(tfm);
}