diff options
Diffstat (limited to 'crypto/ablkcipher.c')
| -rw-r--r-- | crypto/ablkcipher.c | 19 | 
1 files changed, 19 insertions, 0 deletions
diff --git a/crypto/ablkcipher.c b/crypto/ablkcipher.c index 94140b3756f..e11ce37c710 100644 --- a/crypto/ablkcipher.c +++ b/crypto/ablkcipher.c @@ -282,6 +282,25 @@ static struct crypto_alg *crypto_lookup_skcipher(const char *name, u32 type,  					  alg->cra_ablkcipher.ivsize))  		return alg; +	crypto_mod_put(alg); +	alg = crypto_alg_mod_lookup(name, type | CRYPTO_ALG_TESTED, +				    mask & ~CRYPTO_ALG_TESTED); +	if (IS_ERR(alg)) +		return alg; + +	if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == +	    CRYPTO_ALG_TYPE_GIVCIPHER) { +		if ((alg->cra_flags ^ type ^ ~mask) & CRYPTO_ALG_TESTED) { +			crypto_mod_put(alg); +			alg = ERR_PTR(-ENOENT); +		} +		return alg; +	} + +	BUG_ON(!((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == +		 CRYPTO_ALG_TYPE_BLKCIPHER ? alg->cra_blkcipher.ivsize : +					     alg->cra_ablkcipher.ivsize)); +  	return ERR_PTR(crypto_givcipher_default(alg, type, mask));  }  |