if (alg == NULL)
goto out;
- tfm = kmalloc(sizeof(*tfm), GFP_KERNEL);
+ tfm = kmalloc(sizeof(*tfm) + alg->cra_ctxsize, GFP_KERNEL);
if (tfm == NULL)
goto out_put;
memset(tfm, 0, sizeof(*tfm));
- if (alg->cra_ctxsize) {
- tfm->crt_ctx = kmalloc(alg->cra_ctxsize, GFP_KERNEL);
- if (tfm->crt_ctx == NULL)
- goto out_free_tfm;
- }
+ tfm->crt_ctx = (void*) &tfm[1];
tfm->__crt_alg = alg;
- if (alg->cra_blocksize) {
- tfm->crt_work_block = kmalloc(alg->cra_blocksize + 1,
- GFP_KERNEL);
- if (tfm->crt_work_block == NULL)
- goto out_free_ctx;
- }
-
if (crypto_init_flags(tfm, flags))
- goto out_free_work_block;
+ goto out_free_tfm;
if (crypto_init_ops(tfm)) {
crypto_exit_ops(tfm);
- goto out_free_ctx;
+ goto out_free_tfm;
}
goto out;
-out_free_work_block:
- if (tfm->__crt_alg->cra_blocksize)
- kfree(tfm->crt_work_block);
-
-out_free_ctx:
- if (tfm->__crt_alg->cra_ctxsize)
- kfree(tfm->crt_ctx);
out_free_tfm:
kfree(tfm);
tfm = NULL;
void crypto_free_tfm(struct crypto_tfm *tfm)
{
- if (tfm->__crt_alg->cra_ctxsize)
- kfree(tfm->crt_ctx);
-
- if (tfm->__crt_alg->cra_blocksize)
- kfree(tfm->crt_work_block);
-
if (crypto_tfm_alg_type(tfm) == CRYPTO_ALG_TYPE_CIPHER)
if (tfm->crt_cipher.cit_iv)
kfree(tfm->crt_cipher.cit_iv);