@ -168,6 +168,20 @@ static inline struct cryptd_queue *cryptd_get_queue(struct crypto_tfm *tfm)
return ictx - > queue ;
}
static inline void cryptd_check_internal ( struct rtattr * * tb , u32 * type ,
u32 * mask )
{
struct crypto_attr_type * algt ;
algt = crypto_get_attr_type ( tb ) ;
if ( IS_ERR ( algt ) )
return ;
if ( ( algt - > type & CRYPTO_ALG_INTERNAL ) )
* type | = CRYPTO_ALG_INTERNAL ;
if ( ( algt - > mask & CRYPTO_ALG_INTERNAL ) )
* mask | = CRYPTO_ALG_INTERNAL ;
}
static int cryptd_blkcipher_setkey ( struct crypto_ablkcipher * parent ,
const u8 * key , unsigned int keylen )
{
@ -321,10 +335,13 @@ static int cryptd_create_blkcipher(struct crypto_template *tmpl,
struct cryptd_instance_ctx * ctx ;
struct crypto_instance * inst ;
struct crypto_alg * alg ;
u32 type = CRYPTO_ALG_TYPE_BLKCIPHER ;
u32 mask = CRYPTO_ALG_TYPE_MASK ;
int err ;
alg = crypto_get_attr_alg ( tb , CRYPTO_ALG_TYPE_BLKCIPHER ,
CRYPTO_ALG_TYPE_MASK ) ;
cryptd_check_internal ( tb , & type , & mask ) ;
alg = crypto_get_attr_alg ( tb , type , mask ) ;
if ( IS_ERR ( alg ) )
return PTR_ERR ( alg ) ;
@ -341,7 +358,10 @@ static int cryptd_create_blkcipher(struct crypto_template *tmpl,
if ( err )
goto out_free_inst ;
inst - > alg . cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC ;
type = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC ;
if ( alg - > cra_flags & CRYPTO_ALG_INTERNAL )
type | = CRYPTO_ALG_INTERNAL ;
inst - > alg . cra_flags = type ;
inst - > alg . cra_type = & crypto_ablkcipher_type ;
inst - > alg . cra_ablkcipher . ivsize = alg - > cra_blkcipher . ivsize ;
@ -577,9 +597,13 @@ static int cryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
struct ahash_instance * inst ;
struct shash_alg * salg ;
struct crypto_alg * alg ;
u32 type = 0 ;
u32 mask = 0 ;
int err ;
salg = shash_attr_alg ( tb [ 1 ] , 0 , 0 ) ;
cryptd_check_internal ( tb , & type , & mask ) ;
salg = shash_attr_alg ( tb [ 1 ] , type , mask ) ;
if ( IS_ERR ( salg ) )
return PTR_ERR ( salg ) ;
@ -598,7 +622,10 @@ static int cryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
if ( err )
goto out_free_inst ;
inst - > alg . halg . base . cra_flags = CRYPTO_ALG_ASYNC ;
type = CRYPTO_ALG_ASYNC ;
if ( alg - > cra_flags & CRYPTO_ALG_INTERNAL )
type | = CRYPTO_ALG_INTERNAL ;
inst - > alg . halg . base . cra_flags = type ;
inst - > alg . halg . digestsize = salg - > digestsize ;
inst - > alg . halg . base . cra_ctxsize = sizeof ( struct cryptd_hash_ctx ) ;
@ -719,10 +746,13 @@ static int cryptd_create_aead(struct crypto_template *tmpl,
struct aead_instance_ctx * ctx ;
struct crypto_instance * inst ;
struct crypto_alg * alg ;
u32 type = CRYPTO_ALG_TYPE_AEAD ;
u32 mask = CRYPTO_ALG_TYPE_MASK ;
int err ;
alg = crypto_get_attr_alg ( tb , CRYPTO_ALG_TYPE_AEAD ,
CRYPTO_ALG_TYPE_MASK ) ;
cryptd_check_internal ( tb , & type , & mask ) ;
alg = crypto_get_attr_alg ( tb , type , mask ) ;
if ( IS_ERR ( alg ) )
return PTR_ERR ( alg ) ;
@ -739,7 +769,10 @@ static int cryptd_create_aead(struct crypto_template *tmpl,
if ( err )
goto out_free_inst ;
inst - > alg . cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC ;
type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC ;
if ( alg - > cra_flags & CRYPTO_ALG_INTERNAL )
type | = CRYPTO_ALG_INTERNAL ;
inst - > alg . cra_flags = type ;
inst - > alg . cra_type = alg - > cra_type ;
inst - > alg . cra_ctxsize = sizeof ( struct cryptd_aead_ctx ) ;
inst - > alg . cra_init = cryptd_aead_init_tfm ;