Commit c13357fd authored by Ryan Wanner's avatar Ryan Wanner Committed by Herbert Xu
Browse files

crypto: atmel-tdes - Detecting in-place operations with two sg lists



Avoiding detecting finely in-place operations with different
scatter lists. Copying the source data for decryption into rctx->lastc
regardless if the operation is in-place or not. This allows in-place
operations with different scatter lists without affecting other
operations.

This approach takes less resources than parsing both scatter lists to
check if they are equal.

Signed-off-by: default avatarRyan Wanner <Ryan.Wanner@microchip.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 232c1e8e
Loading
Loading
Loading
Loading
+5 −10
Original line number Diff line number Diff line
@@ -565,17 +565,12 @@ atmel_tdes_set_iv_as_last_ciphertext_block(struct atmel_tdes_dev *dd)
	if (req->cryptlen < ivsize)
		return;

	if (rctx->mode & TDES_FLAGS_ENCRYPT) {
	if (rctx->mode & TDES_FLAGS_ENCRYPT)
		scatterwalk_map_and_copy(req->iv, req->dst,
					 req->cryptlen - ivsize, ivsize, 0);
	} else {
		if (req->src == req->dst)
			memcpy(req->iv, rctx->lastc, ivsize);
	else
			scatterwalk_map_and_copy(req->iv, req->src,
						 req->cryptlen - ivsize,
						 ivsize, 0);
	}
		memcpy(req->iv, rctx->lastc, ivsize);

}

static void atmel_tdes_finish_req(struct atmel_tdes_dev *dd, int err)
@@ -722,7 +717,7 @@ static int atmel_tdes_crypt(struct skcipher_request *req, unsigned long mode)
	rctx->mode = mode;

	if ((mode & TDES_FLAGS_OPMODE_MASK) != TDES_FLAGS_ECB &&
	    !(mode & TDES_FLAGS_ENCRYPT) && req->src == req->dst) {
	    !(mode & TDES_FLAGS_ENCRYPT)) {
		unsigned int ivsize = crypto_skcipher_ivsize(skcipher);

		if (req->cryptlen >= ivsize)