Commit 927ef32d authored by Herbert Xu's avatar Herbert Xu

crypto: authenc - Consider ahash ASYNC bit

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: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent c34252fd
...@@ -392,7 +392,8 @@ static int crypto_authenc_create(struct crypto_template *tmpl, ...@@ -392,7 +392,8 @@ static int crypto_authenc_create(struct crypto_template *tmpl,
return -EINVAL; return -EINVAL;
auth = ahash_attr_alg(tb[1], CRYPTO_ALG_TYPE_HASH, 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)) if (IS_ERR(auth))
return PTR_ERR(auth); return PTR_ERR(auth);
...@@ -438,7 +439,8 @@ static int crypto_authenc_create(struct crypto_template *tmpl, ...@@ -438,7 +439,8 @@ static int crypto_authenc_create(struct crypto_template *tmpl,
enc->cra_driver_name) >= CRYPTO_MAX_ALG_NAME) enc->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
goto err_drop_enc; 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 + inst->alg.base.cra_priority = enc->cra_priority * 10 +
auth_base->cra_priority; auth_base->cra_priority;
inst->alg.base.cra_blocksize = enc->cra_blocksize; inst->alg.base.cra_blocksize = enc->cra_blocksize;
......
...@@ -413,7 +413,8 @@ static int crypto_authenc_esn_create(struct crypto_template *tmpl, ...@@ -413,7 +413,8 @@ static int crypto_authenc_esn_create(struct crypto_template *tmpl,
return -EINVAL; return -EINVAL;
auth = ahash_attr_alg(tb[1], CRYPTO_ALG_TYPE_HASH, 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)) if (IS_ERR(auth))
return PTR_ERR(auth); return PTR_ERR(auth);
...@@ -456,7 +457,8 @@ static int crypto_authenc_esn_create(struct crypto_template *tmpl, ...@@ -456,7 +457,8 @@ static int crypto_authenc_esn_create(struct crypto_template *tmpl,
enc->cra_driver_name) >= CRYPTO_MAX_ALG_NAME) enc->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
goto err_drop_enc; 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 + inst->alg.base.cra_priority = enc->cra_priority * 10 +
auth_base->cra_priority; auth_base->cra_priority;
inst->alg.base.cra_blocksize = enc->cra_blocksize; inst->alg.base.cra_blocksize = enc->cra_blocksize;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment