Patch "staging: ccree: save ciphertext for CTS IV" has been added to the 4.13-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
staging: ccree: save ciphertext for CTS IV
to the 4.13-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
staging-ccree-save-ciphertext-for-cts-iv.patch
and it can be found in the queue-4.13 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
737aed947f9b5bd749a2684e13572ee99a1b8baeMon Sep 17 00:00:00 2001
From: Gilad Ben-Yossef <[email protected]>
Date: Wed, 23 Aug 2017 12:12:05 +0300
Subject: staging: ccree: save ciphertext for CTS IV
From: Gilad Ben-Yossef <[email protected]>
commit 737aed947f9b5bd749a2684e13572ee99a1b8bae upstream.
The crypto API requires saving the last blocks of ciphertext in req->info for use as IV for CTS mode. The ccree driver was not doing this. This patch fixes that.
The bug was manifested with cts(cbc(aes)) mode in tcrypt tests.
--- drivers/staging/ccree/ssi_cipher.c | 40 +++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-)
drivers/staging/ccree/ssi_cipher.c +36 -4
@@ -23,6 +23,7 @@#include <crypto/aes.h> #include <crypto/ctr.h> #include <crypto/des.h> +#include <crypto/scatterwalk.h> #include "ssi_config.h" #include "ssi_driver.h"
@@ -716,6 +717,7 @@ static int ssi_blkcipher_complete(struct {int completion_error =0 ;u32 inflight_counter; +struct ablkcipher_request *req = (struct ablkcipher_request *)areq;ssi_buffer_mgr_unmap_blkcipher_request (dev, req_ctx, ivsize, src, dst);
@@ -726,6 +728,22 @@ static int ssi_blkcipher_complete(struct ctx_p->drvdata->inflight_counter--;if (areq) { +/* +* The crypto API expects us to set the req->info to the last +* ciphertext block. For encrypt, simply copy from the result. +* For decrypt, we must copy from a saved buffer since this +* could be an in-place decryption operation and the src is +* lost by this point. +*/ +if (req_ctx->gen_ctx.op_type ==DRV_CRYPTO_DIRECTION_DECRYPT ) { +memcpy (req->info, req_ctx->backup_info, ivsize); +kfree (req_ctx->backup_info); + }else { +scatterwalk_map_and_copy (req->info, req->dst, + (req->nbytes - ivsize), + ivsize,0 ); + } +ablkcipher_request_complete (areq, completion_error);return 0 ; }
@@ -759,11 +777,13 @@ static int ssi_blkcipher_process(if (unlikely (validate_data_size (ctx_p, nbytes))) {SSI_LOG_ERR ("Unsupported data size %d.\n" , nbytes);crypto_tfm_set_flags (tfm,CRYPTO_TFM_RES_BAD_BLOCK_LEN ); -return -EINVAL ; + rc = -EINVAL ; + goto exit_process; }if (nbytes ==0 ) {/* No data to process is valid */ -return 0 ; + rc =0 ; + goto exit_process; }/*For CTS in case of data size aligned to 16 use CBC mode*/ if (((nbytes %AES_BLOCK_SIZE ) ==0 ) && (ctx_p->cipher_mode ==DRV_CIPHER_CBC_CTS )) {
@@ -842,6 +862,9 @@ exit_process:if (cts_restore_flag !=0 ) ctx_p->cipher_mode =DRV_CIPHER_CBC_CTS ; +if (rc != -EINPROGRESS ) +kfree (req_ctx->backup_info); +return rc; }
@@ -884,7 +907,6 @@ static int ssi_ablkcipher_encrypt(structstruct blkcipher_req_ctx *req_ctx =ablkcipher_request_ctx (req);unsigned int ivsize =crypto_ablkcipher_ivsize (ablk_tfm); - req_ctx->backup_info = req->info; req_ctx->is_giv = false;return ssi_blkcipher_process (tfm, req_ctx, req->dst, req->src, req->nbytes, req->info, ivsize, (void *)req,DRV_CRYPTO_DIRECTION_ENCRYPT );
@@ -897,8 +919,18 @@ static int ssi_ablkcipher_decrypt(structstruct blkcipher_req_ctx *req_ctx =ablkcipher_request_ctx (req);unsigned int ivsize =crypto_ablkcipher_ivsize (ablk_tfm); - req_ctx->backup_info = req->info; +/* +* Allocate and save the last IV sized bytes of the source, which will +* be lost in case of in-place decryption and might be needed for CTS. +*/ + req_ctx->backup_info =kmalloc (ivsize,GFP_KERNEL ); +if (!req_ctx->backup_info) +return -ENOMEM ; + +scatterwalk_map_and_copy (req_ctx->backup_info, req->src, + (req->nbytes - ivsize), ivsize,0 ); req_ctx->is_giv = false; +return ssi_blkcipher_process (tfm, req_ctx, req->dst, req->src, req->nbytes, req->info, ivsize, (void *)req,DRV_CRYPTO_DIRECTION_DECRYPT ); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.13/staging-ccree-save-ciphertext-for-cts-iv.patch