aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/crypto/ccree/cc_aead.c11
-rw-r--r--drivers/crypto/ccree/cc_buffer_mgr.c15
-rw-r--r--drivers/crypto/ccree/cc_driver.h1
3 files changed, 23 insertions, 4 deletions
diff --git a/drivers/crypto/ccree/cc_aead.c b/drivers/crypto/ccree/cc_aead.c
index a49814d29714..7aa4cbe19a86 100644
--- a/drivers/crypto/ccree/cc_aead.c
+++ b/drivers/crypto/ccree/cc_aead.c
@@ -424,7 +424,7 @@ static int validate_keys_sizes(struct cc_aead_ctx *ctx)
424/* This function prepers the user key so it can pass to the hmac processing 424/* This function prepers the user key so it can pass to the hmac processing
425 * (copy to intenral buffer or hash in case of key longer than block 425 * (copy to intenral buffer or hash in case of key longer than block
426 */ 426 */
427static int cc_get_plain_hmac_key(struct crypto_aead *tfm, const u8 *key, 427static int cc_get_plain_hmac_key(struct crypto_aead *tfm, const u8 *authkey,
428 unsigned int keylen) 428 unsigned int keylen)
429{ 429{
430 dma_addr_t key_dma_addr = 0; 430 dma_addr_t key_dma_addr = 0;
@@ -437,6 +437,7 @@ static int cc_get_plain_hmac_key(struct crypto_aead *tfm, const u8 *key,
437 unsigned int hashmode; 437 unsigned int hashmode;
438 unsigned int idx = 0; 438 unsigned int idx = 0;
439 int rc = 0; 439 int rc = 0;
440 u8 *key = NULL;
440 struct cc_hw_desc desc[MAX_AEAD_SETKEY_SEQ]; 441 struct cc_hw_desc desc[MAX_AEAD_SETKEY_SEQ];
441 dma_addr_t padded_authkey_dma_addr = 442 dma_addr_t padded_authkey_dma_addr =
442 ctx->auth_state.hmac.padded_authkey_dma_addr; 443 ctx->auth_state.hmac.padded_authkey_dma_addr;
@@ -455,11 +456,17 @@ static int cc_get_plain_hmac_key(struct crypto_aead *tfm, const u8 *key,
455 } 456 }
456 457
457 if (keylen != 0) { 458 if (keylen != 0) {
459
460 key = kmemdup(authkey, keylen, GFP_KERNEL);
461 if (!key)
462 return -ENOMEM;
463
458 key_dma_addr = dma_map_single(dev, (void *)key, keylen, 464 key_dma_addr = dma_map_single(dev, (void *)key, keylen,
459 DMA_TO_DEVICE); 465 DMA_TO_DEVICE);
460 if (dma_mapping_error(dev, key_dma_addr)) { 466 if (dma_mapping_error(dev, key_dma_addr)) {
461 dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n", 467 dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n",
462 key, keylen); 468 key, keylen);
469 kzfree(key);
463 return -ENOMEM; 470 return -ENOMEM;
464 } 471 }
465 if (keylen > blocksize) { 472 if (keylen > blocksize) {
@@ -542,6 +549,8 @@ static int cc_get_plain_hmac_key(struct crypto_aead *tfm, const u8 *key,
542 if (key_dma_addr) 549 if (key_dma_addr)
543 dma_unmap_single(dev, key_dma_addr, keylen, DMA_TO_DEVICE); 550 dma_unmap_single(dev, key_dma_addr, keylen, DMA_TO_DEVICE);
544 551
552 kzfree(key);
553
545 return rc; 554 return rc;
546} 555}
547 556
diff --git a/drivers/crypto/ccree/cc_buffer_mgr.c b/drivers/crypto/ccree/cc_buffer_mgr.c
index 09dceec7d828..c81ad33f9115 100644
--- a/drivers/crypto/ccree/cc_buffer_mgr.c
+++ b/drivers/crypto/ccree/cc_buffer_mgr.c
@@ -557,6 +557,7 @@ void cc_unmap_aead_request(struct device *dev, struct aead_request *req)
557 if (areq_ctx->gen_ctx.iv_dma_addr) { 557 if (areq_ctx->gen_ctx.iv_dma_addr) {
558 dma_unmap_single(dev, areq_ctx->gen_ctx.iv_dma_addr, 558 dma_unmap_single(dev, areq_ctx->gen_ctx.iv_dma_addr,
559 hw_iv_size, DMA_BIDIRECTIONAL); 559 hw_iv_size, DMA_BIDIRECTIONAL);
560 kzfree(areq_ctx->gen_ctx.iv);
560 } 561 }
561 562
562 /* Release pool */ 563 /* Release pool */
@@ -607,19 +608,27 @@ static int cc_aead_chain_iv(struct cc_drvdata *drvdata,
607 struct aead_req_ctx *areq_ctx = aead_request_ctx(req); 608 struct aead_req_ctx *areq_ctx = aead_request_ctx(req);
608 unsigned int hw_iv_size = areq_ctx->hw_iv_size; 609 unsigned int hw_iv_size = areq_ctx->hw_iv_size;
609 struct device *dev = drvdata_to_dev(drvdata); 610 struct device *dev = drvdata_to_dev(drvdata);
611 gfp_t flags = cc_gfp_flags(&req->base);
610 int rc = 0; 612 int rc = 0;
611 613
612 if (!req->iv) { 614 if (!req->iv) {
613 areq_ctx->gen_ctx.iv_dma_addr = 0; 615 areq_ctx->gen_ctx.iv_dma_addr = 0;
616 areq_ctx->gen_ctx.iv = NULL;
614 goto chain_iv_exit; 617 goto chain_iv_exit;
615 } 618 }
616 619
617 areq_ctx->gen_ctx.iv_dma_addr = dma_map_single(dev, req->iv, 620 areq_ctx->gen_ctx.iv = kmemdup(req->iv, hw_iv_size, flags);
618 hw_iv_size, 621 if (!areq_ctx->gen_ctx.iv)
619 DMA_BIDIRECTIONAL); 622 return -ENOMEM;
623
624 areq_ctx->gen_ctx.iv_dma_addr =
625 dma_map_single(dev, areq_ctx->gen_ctx.iv, hw_iv_size,
626 DMA_BIDIRECTIONAL);
620 if (dma_mapping_error(dev, areq_ctx->gen_ctx.iv_dma_addr)) { 627 if (dma_mapping_error(dev, areq_ctx->gen_ctx.iv_dma_addr)) {
621 dev_err(dev, "Mapping iv %u B at va=%pK for DMA failed\n", 628 dev_err(dev, "Mapping iv %u B at va=%pK for DMA failed\n",
622 hw_iv_size, req->iv); 629 hw_iv_size, req->iv);
630 kzfree(areq_ctx->gen_ctx.iv);
631 areq_ctx->gen_ctx.iv = NULL;
623 rc = -ENOMEM; 632 rc = -ENOMEM;
624 goto chain_iv_exit; 633 goto chain_iv_exit;
625 } 634 }
diff --git a/drivers/crypto/ccree/cc_driver.h b/drivers/crypto/ccree/cc_driver.h
index 695ccbd52ae4..b76181335c08 100644
--- a/drivers/crypto/ccree/cc_driver.h
+++ b/drivers/crypto/ccree/cc_driver.h
@@ -199,6 +199,7 @@ struct cc_alg_template {
199 199
200struct async_gen_req_ctx { 200struct async_gen_req_ctx {
201 dma_addr_t iv_dma_addr; 201 dma_addr_t iv_dma_addr;
202 u8 *iv;
202 enum drv_crypto_direction op_type; 203 enum drv_crypto_direction op_type;
203}; 204};
204 205