crypto: caam - properly set IV after {en,de}crypt
commit854b06f768
upstream. Certain cipher modes like CTS expect the IV (req->info) of ablkcipher_request (or equivalently req->iv of skcipher_request) to contain the last ciphertext block when the {en,de}crypt operation is done. This is currently not the case for the CAAM driver which in turn breaks e.g. cts(cbc(aes)) when the CAAM driver is enabled. This patch fixes the CAAM driver to properly set the IV after the {en,de}crypt operation of ablkcipher finishes. This issue was revealed by the changes in the SW CTS mode in commit0605c41cc5
("crypto: cts - Convert to skcipher") Signed-off-by: David Gstir <david@sigma-star.at> Reviewed-by: Horia Geantă <horia.geanta@nxp.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
db923288f3
commit
48a9dff213
|
@ -2014,10 +2014,10 @@ static void ablkcipher_encrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||||
{
|
{
|
||||||
struct ablkcipher_request *req = context;
|
struct ablkcipher_request *req = context;
|
||||||
struct ablkcipher_edesc *edesc;
|
struct ablkcipher_edesc *edesc;
|
||||||
#ifdef DEBUG
|
|
||||||
struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
|
struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
|
||||||
int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
|
int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
|
dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2037,6 +2037,14 @@ static void ablkcipher_encrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ablkcipher_unmap(jrdev, edesc, req);
|
ablkcipher_unmap(jrdev, edesc, req);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The crypto API expects us to set the IV (req->info) to the last
|
||||||
|
* ciphertext block. This is used e.g. by the CTS mode.
|
||||||
|
*/
|
||||||
|
scatterwalk_map_and_copy(req->info, req->dst, req->nbytes - ivsize,
|
||||||
|
ivsize, 0);
|
||||||
|
|
||||||
kfree(edesc);
|
kfree(edesc);
|
||||||
|
|
||||||
ablkcipher_request_complete(req, err);
|
ablkcipher_request_complete(req, err);
|
||||||
|
@ -2047,10 +2055,10 @@ static void ablkcipher_decrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||||
{
|
{
|
||||||
struct ablkcipher_request *req = context;
|
struct ablkcipher_request *req = context;
|
||||||
struct ablkcipher_edesc *edesc;
|
struct ablkcipher_edesc *edesc;
|
||||||
#ifdef DEBUG
|
|
||||||
struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
|
struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
|
||||||
int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
|
int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
|
dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2069,6 +2077,14 @@ static void ablkcipher_decrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ablkcipher_unmap(jrdev, edesc, req);
|
ablkcipher_unmap(jrdev, edesc, req);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The crypto API expects us to set the IV (req->info) to the last
|
||||||
|
* ciphertext block.
|
||||||
|
*/
|
||||||
|
scatterwalk_map_and_copy(req->info, req->src, req->nbytes - ivsize,
|
||||||
|
ivsize, 0);
|
||||||
|
|
||||||
kfree(edesc);
|
kfree(edesc);
|
||||||
|
|
||||||
ablkcipher_request_complete(req, err);
|
ablkcipher_request_complete(req, err);
|
||||||
|
|
Loading…
Reference in a new issue