Commit e7922729 authored by Harsh Jain's avatar Harsh Jain Committed by Herbert Xu

crypto: chcr - Use SHASH_DESC_ON_STACK

Use SHASH_DESC_ON_STACK macro to allocate memory for ipad/opad
calculation.
Signed-off-by: default avatarHarsh Jain <harsh@chelsio.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent adf1ca61
...@@ -228,40 +228,29 @@ static inline void get_aes_decrypt_key(unsigned char *dec_key, ...@@ -228,40 +228,29 @@ static inline void get_aes_decrypt_key(unsigned char *dec_key,
} }
} }
static struct shash_desc *chcr_alloc_shash(unsigned int ds) static struct crypto_shash *chcr_alloc_shash(unsigned int ds)
{ {
struct crypto_shash *base_hash = NULL; struct crypto_shash *base_hash = NULL;
struct shash_desc *desc;
switch (ds) { switch (ds) {
case SHA1_DIGEST_SIZE: case SHA1_DIGEST_SIZE:
base_hash = crypto_alloc_shash("sha1-generic", 0, 0); base_hash = crypto_alloc_shash("sha1", 0, 0);
break; break;
case SHA224_DIGEST_SIZE: case SHA224_DIGEST_SIZE:
base_hash = crypto_alloc_shash("sha224-generic", 0, 0); base_hash = crypto_alloc_shash("sha224", 0, 0);
break; break;
case SHA256_DIGEST_SIZE: case SHA256_DIGEST_SIZE:
base_hash = crypto_alloc_shash("sha256-generic", 0, 0); base_hash = crypto_alloc_shash("sha256", 0, 0);
break; break;
case SHA384_DIGEST_SIZE: case SHA384_DIGEST_SIZE:
base_hash = crypto_alloc_shash("sha384-generic", 0, 0); base_hash = crypto_alloc_shash("sha384", 0, 0);
break; break;
case SHA512_DIGEST_SIZE: case SHA512_DIGEST_SIZE:
base_hash = crypto_alloc_shash("sha512-generic", 0, 0); base_hash = crypto_alloc_shash("sha512", 0, 0);
break; break;
} }
if (IS_ERR(base_hash)) {
pr_err("Can not allocate sha-generic algo.\n");
return (void *)base_hash;
}
desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(base_hash), return base_hash;
GFP_KERNEL);
if (!desc)
return ERR_PTR(-ENOMEM);
desc->tfm = base_hash;
desc->flags = crypto_shash_get_flags(base_hash);
return desc;
} }
static int chcr_compute_partial_hash(struct shash_desc *desc, static int chcr_compute_partial_hash(struct shash_desc *desc,
...@@ -770,6 +759,11 @@ static int get_alg_config(struct algo_param *params, ...@@ -770,6 +759,11 @@ static int get_alg_config(struct algo_param *params,
return 0; return 0;
} }
static inline void chcr_free_shash(struct crypto_shash *base_hash)
{
crypto_free_shash(base_hash);
}
/** /**
* create_hash_wr - Create hash work request * create_hash_wr - Create hash work request
* @req - Cipher req base * @req - Cipher req base
...@@ -1106,15 +1100,16 @@ static int chcr_ahash_setkey(struct crypto_ahash *tfm, const u8 *key, ...@@ -1106,15 +1100,16 @@ static int chcr_ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
unsigned int bs = crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm)); unsigned int bs = crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
unsigned int i, err = 0, updated_digestsize; unsigned int i, err = 0, updated_digestsize;
/* SHASH_DESC_ON_STACK(shash, hmacctx->base_hash);
* use the key to calculate the ipad and opad. ipad will sent with the
/* use the key to calculate the ipad and opad. ipad will sent with the
* first request's data. opad will be sent with the final hash result * first request's data. opad will be sent with the final hash result
* ipad in hmacctx->ipad and opad in hmacctx->opad location * ipad in hmacctx->ipad and opad in hmacctx->opad location
*/ */
if (!hmacctx->desc) shash->tfm = hmacctx->base_hash;
return -EINVAL; shash->flags = crypto_shash_get_flags(hmacctx->base_hash);
if (keylen > bs) { if (keylen > bs) {
err = crypto_shash_digest(hmacctx->desc, key, keylen, err = crypto_shash_digest(shash, key, keylen,
hmacctx->ipad); hmacctx->ipad);
if (err) if (err)
goto out; goto out;
...@@ -1135,13 +1130,13 @@ static int chcr_ahash_setkey(struct crypto_ahash *tfm, const u8 *key, ...@@ -1135,13 +1130,13 @@ static int chcr_ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
updated_digestsize = SHA256_DIGEST_SIZE; updated_digestsize = SHA256_DIGEST_SIZE;
else if (digestsize == SHA384_DIGEST_SIZE) else if (digestsize == SHA384_DIGEST_SIZE)
updated_digestsize = SHA512_DIGEST_SIZE; updated_digestsize = SHA512_DIGEST_SIZE;
err = chcr_compute_partial_hash(hmacctx->desc, hmacctx->ipad, err = chcr_compute_partial_hash(shash, hmacctx->ipad,
hmacctx->ipad, digestsize); hmacctx->ipad, digestsize);
if (err) if (err)
goto out; goto out;
chcr_change_order(hmacctx->ipad, updated_digestsize); chcr_change_order(hmacctx->ipad, updated_digestsize);
err = chcr_compute_partial_hash(hmacctx->desc, hmacctx->opad, err = chcr_compute_partial_hash(shash, hmacctx->opad,
hmacctx->opad, digestsize); hmacctx->opad, digestsize);
if (err) if (err)
goto out; goto out;
...@@ -1237,26 +1232,20 @@ static int chcr_hmac_cra_init(struct crypto_tfm *tfm) ...@@ -1237,26 +1232,20 @@ static int chcr_hmac_cra_init(struct crypto_tfm *tfm)
crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm), crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
sizeof(struct chcr_ahash_req_ctx)); sizeof(struct chcr_ahash_req_ctx));
hmacctx->desc = chcr_alloc_shash(digestsize); hmacctx->base_hash = chcr_alloc_shash(digestsize);
if (IS_ERR(hmacctx->desc)) if (IS_ERR(hmacctx->base_hash))
return PTR_ERR(hmacctx->desc); return PTR_ERR(hmacctx->base_hash);
return chcr_device_init(crypto_tfm_ctx(tfm)); return chcr_device_init(crypto_tfm_ctx(tfm));
} }
static void chcr_free_shash(struct shash_desc *desc)
{
crypto_free_shash(desc->tfm);
kfree(desc);
}
static void chcr_hmac_cra_exit(struct crypto_tfm *tfm) static void chcr_hmac_cra_exit(struct crypto_tfm *tfm)
{ {
struct chcr_context *ctx = crypto_tfm_ctx(tfm); struct chcr_context *ctx = crypto_tfm_ctx(tfm);
struct hmac_ctx *hmacctx = HMAC_CTX(ctx); struct hmac_ctx *hmacctx = HMAC_CTX(ctx);
if (hmacctx->desc) { if (hmacctx->base_hash) {
chcr_free_shash(hmacctx->desc); chcr_free_shash(hmacctx->base_hash);
hmacctx->desc = NULL; hmacctx->base_hash = NULL;
} }
} }
......
...@@ -132,7 +132,7 @@ struct ablk_ctx { ...@@ -132,7 +132,7 @@ struct ablk_ctx {
}; };
struct hmac_ctx { struct hmac_ctx {
struct shash_desc *desc; struct crypto_shash *base_hash;
u8 ipad[CHCR_HASH_MAX_BLOCK_SIZE_128]; u8 ipad[CHCR_HASH_MAX_BLOCK_SIZE_128];
u8 opad[CHCR_HASH_MAX_BLOCK_SIZE_128]; u8 opad[CHCR_HASH_MAX_BLOCK_SIZE_128];
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment