aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2016-06-29 06:03:46 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2016-07-01 11:45:02 -0400
commit927ef32dccfe6e048a163138b8e714b2d944194d (patch)
tree884de0ba5d1d47c7997ab4aec04519d22c597477 /crypto
parentc34252fd712c10da3a0b018b3b5dbe552ac1e7b9 (diff)
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: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/authenc.c6
-rw-r--r--crypto/authencesn.c6
2 files changed, 8 insertions, 4 deletions
diff --git a/crypto/authenc.c b/crypto/authenc.c
index c7cc11d36480..309fbc17222d 100644
--- a/crypto/authenc.c
+++ b/crypto/authenc.c
@@ -392,7 +392,8 @@ static int crypto_authenc_create(struct crypto_template *tmpl,
392 return -EINVAL; 392 return -EINVAL;
393 393
394 auth = ahash_attr_alg(tb[1], CRYPTO_ALG_TYPE_HASH, 394 auth = ahash_attr_alg(tb[1], CRYPTO_ALG_TYPE_HASH,
395 CRYPTO_ALG_TYPE_AHASH_MASK); 395 CRYPTO_ALG_TYPE_AHASH_MASK |
396 crypto_requires_sync(algt->type, algt->mask));
396 if (IS_ERR(auth)) 397 if (IS_ERR(auth))
397 return PTR_ERR(auth); 398 return PTR_ERR(auth);
398 399
@@ -438,7 +439,8 @@ static int crypto_authenc_create(struct crypto_template *tmpl,
438 enc->cra_driver_name) >= CRYPTO_MAX_ALG_NAME) 439 enc->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
439 goto err_drop_enc; 440 goto err_drop_enc;
440 441
441 inst->alg.base.cra_flags = enc->cra_flags & CRYPTO_ALG_ASYNC; 442 inst->alg.base.cra_flags = (auth_base->cra_flags | enc->cra_flags) &
443 CRYPTO_ALG_ASYNC;
442 inst->alg.base.cra_priority = enc->cra_priority * 10 + 444 inst->alg.base.cra_priority = enc->cra_priority * 10 +
443 auth_base->cra_priority; 445 auth_base->cra_priority;
444 inst->alg.base.cra_blocksize = enc->cra_blocksize; 446 inst->alg.base.cra_blocksize = enc->cra_blocksize;
diff --git a/crypto/authencesn.c b/crypto/authencesn.c
index 0c0468869e25..0662b1848c5d 100644
--- a/crypto/authencesn.c
+++ b/crypto/authencesn.c
@@ -413,7 +413,8 @@ static int crypto_authenc_esn_create(struct crypto_template *tmpl,
413 return -EINVAL; 413 return -EINVAL;
414 414
415 auth = ahash_attr_alg(tb[1], CRYPTO_ALG_TYPE_HASH, 415 auth = ahash_attr_alg(tb[1], CRYPTO_ALG_TYPE_HASH,
416 CRYPTO_ALG_TYPE_AHASH_MASK); 416 CRYPTO_ALG_TYPE_AHASH_MASK |
417 crypto_requires_sync(algt->type, algt->mask));
417 if (IS_ERR(auth)) 418 if (IS_ERR(auth))
418 return PTR_ERR(auth); 419 return PTR_ERR(auth);
419 420
@@ -456,7 +457,8 @@ static int crypto_authenc_esn_create(struct crypto_template *tmpl,
456 enc->cra_driver_name) >= CRYPTO_MAX_ALG_NAME) 457 enc->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
457 goto err_drop_enc; 458 goto err_drop_enc;
458 459
459 inst->alg.base.cra_flags = enc->cra_flags & CRYPTO_ALG_ASYNC; 460 inst->alg.base.cra_flags = (auth_base->cra_flags | enc->cra_flags) &
461 CRYPTO_ALG_ASYNC;
460 inst->alg.base.cra_priority = enc->cra_priority * 10 + 462 inst->alg.base.cra_priority = enc->cra_priority * 10 +
461 auth_base->cra_priority; 463 auth_base->cra_priority;
462 inst->alg.base.cra_blocksize = enc->cra_blocksize; 464 inst->alg.base.cra_blocksize = enc->cra_blocksize;