diff options
| -rw-r--r-- | drivers/crypto/ccree/cc_aead.c | 11 | ||||
| -rw-r--r-- | drivers/crypto/ccree/cc_buffer_mgr.c | 15 | ||||
| -rw-r--r-- | drivers/crypto/ccree/cc_driver.h | 1 |
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 | */ |
| 427 | static int cc_get_plain_hmac_key(struct crypto_aead *tfm, const u8 *key, | 427 | static 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 | ||
| 200 | struct async_gen_req_ctx { | 200 | struct 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 | ||
