@ -258,6 +258,20 @@ out_free_inst:
goto out ;
}
static inline void mcryptd_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 mcryptd_hash_init_tfm ( struct crypto_tfm * tfm )
{
struct crypto_instance * inst = crypto_tfm_alg_instance ( tfm ) ;
@ -480,9 +494,13 @@ static int mcryptd_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 ) ;
mcryptd_check_internal ( tb , & type , & mask ) ;
salg = shash_attr_alg ( tb [ 1 ] , type , mask ) ;
if ( IS_ERR ( salg ) )
return PTR_ERR ( salg ) ;
@ -502,7 +520,10 @@ static int mcryptd_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 mcryptd_hash_ctx ) ;