Skip to content

Commit

Permalink
crypto: echainiv - Move IV seeding into init function
Browse files Browse the repository at this point in the history
We currently do the IV seeding on the first givencrypt call in
order to conserve entropy.  However, this does not work with
DRBG which cannot be called from interrupt context.  In fact,
with DRBG we don't need to conserve entropy anyway.  So this
patch moves the seeding into the init function.

Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
herbertx committed Jun 4, 2015
1 parent 65fe674 commit f261c5f
Showing 1 changed file with 6 additions and 24 deletions.
30 changes: 6 additions & 24 deletions crypto/echainiv.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,29 +187,6 @@ static int echainiv_decrypt(struct aead_request *req)
return crypto_aead_decrypt(subreq);
}

static int echainiv_encrypt_first(struct aead_request *req)
{
struct crypto_aead *geniv = crypto_aead_reqtfm(req);
struct echainiv_ctx *ctx = crypto_aead_ctx(geniv);
int err = 0;

spin_lock_bh(&ctx->geniv.lock);
if (geniv->encrypt != echainiv_encrypt_first)
goto unlock;

geniv->encrypt = echainiv_encrypt;
err = crypto_rng_get_bytes(crypto_default_rng, ctx->salt,
crypto_aead_ivsize(geniv));

unlock:
spin_unlock_bh(&ctx->geniv.lock);

if (err)
return err;

return echainiv_encrypt(req);
}

static int echainiv_init(struct crypto_tfm *tfm)
{
struct crypto_aead *geniv = __crypto_aead_cast(tfm);
Expand All @@ -220,6 +197,11 @@ static int echainiv_init(struct crypto_tfm *tfm)

crypto_aead_set_reqsize(geniv, sizeof(struct aead_request));

err = crypto_rng_get_bytes(crypto_default_rng, ctx->salt,
crypto_aead_ivsize(geniv));
if (err)
goto out;

ctx->null = crypto_get_default_null_skcipher();
err = PTR_ERR(ctx->null);
if (IS_ERR(ctx->null))
Expand Down Expand Up @@ -272,7 +254,7 @@ static int echainiv_aead_create(struct crypto_template *tmpl,
inst->alg.ivsize > MAX_IV_SIZE)
goto free_inst;

inst->alg.encrypt = echainiv_encrypt_first;
inst->alg.encrypt = echainiv_encrypt;
inst->alg.decrypt = echainiv_decrypt;

inst->alg.base.cra_init = echainiv_init;
Expand Down

0 comments on commit f261c5f

Please sign in to comment.