crypto: authenc - Consider ahash ASYNC bit
authorHerbert Xu <herbert@gondor.apana.org.au>
Wed, 29 Jun 2016 10:03:46 +0000 (18:03 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 1 Jul 2016 15:45:02 +0000 (23:45 +0800)
As it is, if you get an async ahash with a sync skcipher you'll
end up with a sync authenc, which is wrong.

This patch fixes it by considering the ASYNC bit from ahash as
well.

It also fixes a little bug where if a sync version of authenc
is requested we may still end up using an async ahash.

Neither of them should have any effect as none of the authenc
users can request for a sync authenc.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/authenc.c
crypto/authencesn.c

index c7cc11d364805d4e3f54baf14fbebfcdb16a0a77..309fbc17222d0d94fa57d448c0c7dd6b71b868c7 100644 (file)
@@ -392,7 +392,8 @@ static int crypto_authenc_create(struct crypto_template *tmpl,
                return -EINVAL;
 
        auth = ahash_attr_alg(tb[1], CRYPTO_ALG_TYPE_HASH,
-                              CRYPTO_ALG_TYPE_AHASH_MASK);
+                             CRYPTO_ALG_TYPE_AHASH_MASK |
+                             crypto_requires_sync(algt->type, algt->mask));
        if (IS_ERR(auth))
                return PTR_ERR(auth);
 
@@ -438,7 +439,8 @@ static int crypto_authenc_create(struct crypto_template *tmpl,
                     enc->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
                goto err_drop_enc;
 
-       inst->alg.base.cra_flags = enc->cra_flags & CRYPTO_ALG_ASYNC;
+       inst->alg.base.cra_flags = (auth_base->cra_flags | enc->cra_flags) &
+                                  CRYPTO_ALG_ASYNC;
        inst->alg.base.cra_priority = enc->cra_priority * 10 +
                                      auth_base->cra_priority;
        inst->alg.base.cra_blocksize = enc->cra_blocksize;
index 0c0468869e25b51035cf363fd3f3e2f7903330fb..0662b1848c5d8ca5e98659a80182b13dbc202e54 100644 (file)
@@ -413,7 +413,8 @@ static int crypto_authenc_esn_create(struct crypto_template *tmpl,
                return -EINVAL;
 
        auth = ahash_attr_alg(tb[1], CRYPTO_ALG_TYPE_HASH,
-                              CRYPTO_ALG_TYPE_AHASH_MASK);
+                             CRYPTO_ALG_TYPE_AHASH_MASK |
+                             crypto_requires_sync(algt->type, algt->mask));
        if (IS_ERR(auth))
                return PTR_ERR(auth);
 
@@ -456,7 +457,8 @@ static int crypto_authenc_esn_create(struct crypto_template *tmpl,
                     enc->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
                goto err_drop_enc;
 
-       inst->alg.base.cra_flags = enc->cra_flags & CRYPTO_ALG_ASYNC;
+       inst->alg.base.cra_flags = (auth_base->cra_flags | enc->cra_flags) &
+                                  CRYPTO_ALG_ASYNC;
        inst->alg.base.cra_priority = enc->cra_priority * 10 +
                                      auth_base->cra_priority;
        inst->alg.base.cra_blocksize = enc->cra_blocksize;