Merge branch 'i2c/for-4.2' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
[cascardo/linux.git] / crypto / eseqiv.c
index 78a7264..16dda72 100644 (file)
@@ -152,6 +152,7 @@ static int eseqiv_init(struct crypto_tfm *tfm)
        struct eseqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv);
        unsigned long alignmask;
        unsigned int reqsize;
+       int err;
 
        spin_lock_init(&ctx->lock);
 
@@ -175,9 +176,15 @@ static int eseqiv_init(struct crypto_tfm *tfm)
        tfm->crt_ablkcipher.reqsize = reqsize +
                                      sizeof(struct ablkcipher_request);
 
-       return crypto_rng_get_bytes(crypto_default_rng, ctx->salt,
-                                   crypto_ablkcipher_ivsize(geniv)) ?:
-              skcipher_geniv_init(tfm);
+       err = 0;
+       if (!crypto_get_default_rng()) {
+               crypto_ablkcipher_crt(geniv)->givencrypt = eseqiv_givencrypt;
+               err = crypto_rng_get_bytes(crypto_default_rng, ctx->salt,
+                                          crypto_ablkcipher_ivsize(geniv));
+               crypto_put_default_rng();
+       }
+
+       return err ?: skcipher_geniv_init(tfm);
 }
 
 static struct crypto_template eseqiv_tmpl;
@@ -187,20 +194,14 @@ static struct crypto_instance *eseqiv_alloc(struct rtattr **tb)
        struct crypto_instance *inst;
        int err;
 
-       err = crypto_get_default_rng();
-       if (err)
-               return ERR_PTR(err);
-
        inst = skcipher_geniv_alloc(&eseqiv_tmpl, tb, 0, 0);
        if (IS_ERR(inst))
-               goto put_rng;
+               goto out;
 
        err = -EINVAL;
        if (inst->alg.cra_ablkcipher.ivsize != inst->alg.cra_blocksize)
                goto free_inst;
 
-       inst->alg.cra_ablkcipher.givencrypt = eseqiv_givencrypt;
-
        inst->alg.cra_init = eseqiv_init;
        inst->alg.cra_exit = skcipher_geniv_exit;
 
@@ -213,21 +214,13 @@ out:
 free_inst:
        skcipher_geniv_free(inst);
        inst = ERR_PTR(err);
-put_rng:
-       crypto_put_default_rng();
        goto out;
 }
 
-static void eseqiv_free(struct crypto_instance *inst)
-{
-       skcipher_geniv_free(inst);
-       crypto_put_default_rng();
-}
-
 static struct crypto_template eseqiv_tmpl = {
        .name = "eseqiv",
        .alloc = eseqiv_alloc,
-       .free = eseqiv_free,
+       .free = skcipher_geniv_free,
        .module = THIS_MODULE,
 };