mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 13:53:33 +00:00
crypto: caam - fix asynchronous hash
ahash_alg->setkey is updated to ahash_nosetkey in ahash.c
so checking setkey() function to determine hmac algorithm is not valid.
to fix this added is_hmac variable in structure caam_hash_alg to determine
whether the algorithm is hmac or not.
Fixes: 2f1f34c1bf
("crypto: ahash - optimize performance when wrapping shash")
Signed-off-by: Gaurav Jain <gaurav.jain@nxp.com>
Reviewed-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
e1d54d153f
commit
c5a2f74db7
2 changed files with 10 additions and 4 deletions
|
@ -4545,6 +4545,7 @@ struct caam_hash_alg {
|
||||||
struct list_head entry;
|
struct list_head entry;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
int alg_type;
|
int alg_type;
|
||||||
|
bool is_hmac;
|
||||||
struct ahash_alg ahash_alg;
|
struct ahash_alg ahash_alg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4571,7 +4572,7 @@ static int caam_hash_cra_init(struct crypto_tfm *tfm)
|
||||||
|
|
||||||
ctx->dev = caam_hash->dev;
|
ctx->dev = caam_hash->dev;
|
||||||
|
|
||||||
if (alg->setkey) {
|
if (caam_hash->is_hmac) {
|
||||||
ctx->adata.key_dma = dma_map_single_attrs(ctx->dev, ctx->key,
|
ctx->adata.key_dma = dma_map_single_attrs(ctx->dev, ctx->key,
|
||||||
ARRAY_SIZE(ctx->key),
|
ARRAY_SIZE(ctx->key),
|
||||||
DMA_TO_DEVICE,
|
DMA_TO_DEVICE,
|
||||||
|
@ -4611,7 +4612,7 @@ static int caam_hash_cra_init(struct crypto_tfm *tfm)
|
||||||
* For keyed hash algorithms shared descriptors
|
* For keyed hash algorithms shared descriptors
|
||||||
* will be created later in setkey() callback
|
* will be created later in setkey() callback
|
||||||
*/
|
*/
|
||||||
return alg->setkey ? 0 : ahash_set_sh_desc(ahash);
|
return caam_hash->is_hmac ? 0 : ahash_set_sh_desc(ahash);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void caam_hash_cra_exit(struct crypto_tfm *tfm)
|
static void caam_hash_cra_exit(struct crypto_tfm *tfm)
|
||||||
|
@ -4646,12 +4647,14 @@ static struct caam_hash_alg *caam_hash_alloc(struct device *dev,
|
||||||
template->hmac_name);
|
template->hmac_name);
|
||||||
snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
|
snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
|
||||||
template->hmac_driver_name);
|
template->hmac_driver_name);
|
||||||
|
t_alg->is_hmac = true;
|
||||||
} else {
|
} else {
|
||||||
snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
|
snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
|
||||||
template->name);
|
template->name);
|
||||||
snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
|
snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
|
||||||
template->driver_name);
|
template->driver_name);
|
||||||
t_alg->ahash_alg.setkey = NULL;
|
t_alg->ahash_alg.setkey = NULL;
|
||||||
|
t_alg->is_hmac = false;
|
||||||
}
|
}
|
||||||
alg->cra_module = THIS_MODULE;
|
alg->cra_module = THIS_MODULE;
|
||||||
alg->cra_init = caam_hash_cra_init;
|
alg->cra_init = caam_hash_cra_init;
|
||||||
|
|
|
@ -1753,6 +1753,7 @@ static struct caam_hash_template driver_hash[] = {
|
||||||
struct caam_hash_alg {
|
struct caam_hash_alg {
|
||||||
struct list_head entry;
|
struct list_head entry;
|
||||||
int alg_type;
|
int alg_type;
|
||||||
|
bool is_hmac;
|
||||||
struct ahash_engine_alg ahash_alg;
|
struct ahash_engine_alg ahash_alg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1804,7 +1805,7 @@ static int caam_hash_cra_init(struct crypto_tfm *tfm)
|
||||||
} else {
|
} else {
|
||||||
if (priv->era >= 6) {
|
if (priv->era >= 6) {
|
||||||
ctx->dir = DMA_BIDIRECTIONAL;
|
ctx->dir = DMA_BIDIRECTIONAL;
|
||||||
ctx->key_dir = alg->setkey ? DMA_TO_DEVICE : DMA_NONE;
|
ctx->key_dir = caam_hash->is_hmac ? DMA_TO_DEVICE : DMA_NONE;
|
||||||
} else {
|
} else {
|
||||||
ctx->dir = DMA_TO_DEVICE;
|
ctx->dir = DMA_TO_DEVICE;
|
||||||
ctx->key_dir = DMA_NONE;
|
ctx->key_dir = DMA_NONE;
|
||||||
|
@ -1862,7 +1863,7 @@ static int caam_hash_cra_init(struct crypto_tfm *tfm)
|
||||||
* For keyed hash algorithms shared descriptors
|
* For keyed hash algorithms shared descriptors
|
||||||
* will be created later in setkey() callback
|
* will be created later in setkey() callback
|
||||||
*/
|
*/
|
||||||
return alg->setkey ? 0 : ahash_set_sh_desc(ahash);
|
return caam_hash->is_hmac ? 0 : ahash_set_sh_desc(ahash);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void caam_hash_cra_exit(struct crypto_tfm *tfm)
|
static void caam_hash_cra_exit(struct crypto_tfm *tfm)
|
||||||
|
@ -1915,12 +1916,14 @@ caam_hash_alloc(struct caam_hash_template *template,
|
||||||
template->hmac_name);
|
template->hmac_name);
|
||||||
snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
|
snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
|
||||||
template->hmac_driver_name);
|
template->hmac_driver_name);
|
||||||
|
t_alg->is_hmac = true;
|
||||||
} else {
|
} else {
|
||||||
snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
|
snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
|
||||||
template->name);
|
template->name);
|
||||||
snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
|
snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
|
||||||
template->driver_name);
|
template->driver_name);
|
||||||
halg->setkey = NULL;
|
halg->setkey = NULL;
|
||||||
|
t_alg->is_hmac = false;
|
||||||
}
|
}
|
||||||
alg->cra_module = THIS_MODULE;
|
alg->cra_module = THIS_MODULE;
|
||||||
alg->cra_init = caam_hash_cra_init;
|
alg->cra_init = caam_hash_cra_init;
|
||||||
|
|
Loading…
Reference in a new issue