Skip to content

Commit

Permalink
crypto: eseqiv - 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 f261c5f commit 4ce43ce
Showing 1 changed file with 4 additions and 25 deletions.
29 changes: 4 additions & 25 deletions crypto/eseqiv.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,29 +146,6 @@ static int eseqiv_givencrypt(struct skcipher_givcrypt_request *req)
return err;
}

static int eseqiv_givencrypt_first(struct skcipher_givcrypt_request *req)
{
struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req);
struct eseqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv);
int err = 0;

spin_lock_bh(&ctx->lock);
if (crypto_ablkcipher_crt(geniv)->givencrypt != eseqiv_givencrypt_first)
goto unlock;

crypto_ablkcipher_crt(geniv)->givencrypt = eseqiv_givencrypt;
err = crypto_rng_get_bytes(crypto_default_rng, ctx->salt,
crypto_ablkcipher_ivsize(geniv));

unlock:
spin_unlock_bh(&ctx->lock);

if (err)
return err;

return eseqiv_givencrypt(req);
}

static int eseqiv_init(struct crypto_tfm *tfm)
{
struct crypto_ablkcipher *geniv = __crypto_ablkcipher_cast(tfm);
Expand Down Expand Up @@ -198,7 +175,9 @@ static int eseqiv_init(struct crypto_tfm *tfm)
tfm->crt_ablkcipher.reqsize = reqsize +
sizeof(struct ablkcipher_request);

return skcipher_geniv_init(tfm);
return crypto_rng_get_bytes(crypto_default_rng, ctx->salt,
crypto_ablkcipher_ivsize(geniv)) ?:
skcipher_geniv_init(tfm);
}

static struct crypto_template eseqiv_tmpl;
Expand All @@ -220,7 +199,7 @@ static struct crypto_instance *eseqiv_alloc(struct rtattr **tb)
if (inst->alg.cra_ablkcipher.ivsize != inst->alg.cra_blocksize)
goto free_inst;

inst->alg.cra_ablkcipher.givencrypt = eseqiv_givencrypt_first;
inst->alg.cra_ablkcipher.givencrypt = eseqiv_givencrypt;

inst->alg.cra_init = eseqiv_init;
inst->alg.cra_exit = skcipher_geniv_exit;
Expand Down

0 comments on commit 4ce43ce

Please sign in to comment.