mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-01 22:54:01 +00:00
crypto: rockchip - update IV buffer to contain the next IV
commitf0cfd57b43
upstream. The Kernel Crypto API request output the next IV data to IV buffer for CBC implementation. So the last block data of ciphertext should be copid into assigned IV buffer. Reported-by: Eric Biggers <ebiggers@google.com> Fixes:433cd2c617
("crypto: rockchip - add crypto driver for rk3288") Cc: <stable@vger.kernel.org> # v4.5+ Signed-off-by: Zhang Zhijie <zhangzj@rock-chips.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
9a61ab6898
commit
b7d2adfd05
1 changed files with 18 additions and 7 deletions
|
@ -250,9 +250,14 @@ static int rk_set_data_start(struct rk_crypto_info *dev)
|
|||
u8 *src_last_blk = page_address(sg_page(dev->sg_src)) +
|
||||
dev->sg_src->offset + dev->sg_src->length - ivsize;
|
||||
|
||||
/* store the iv that need to be updated in chain mode */
|
||||
if (ctx->mode & RK_CRYPTO_DEC)
|
||||
/* Store the iv that need to be updated in chain mode.
|
||||
* And update the IV buffer to contain the next IV for decryption mode.
|
||||
*/
|
||||
if (ctx->mode & RK_CRYPTO_DEC) {
|
||||
memcpy(ctx->iv, src_last_blk, ivsize);
|
||||
sg_pcopy_to_buffer(dev->first, dev->src_nents, req->info,
|
||||
ivsize, dev->total - ivsize);
|
||||
}
|
||||
|
||||
err = dev->load_data(dev, dev->sg_src, dev->sg_dst);
|
||||
if (!err)
|
||||
|
@ -288,13 +293,19 @@ static void rk_iv_copyback(struct rk_crypto_info *dev)
|
|||
struct ablkcipher_request *req =
|
||||
ablkcipher_request_cast(dev->async_req);
|
||||
struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
|
||||
struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
|
||||
u32 ivsize = crypto_ablkcipher_ivsize(tfm);
|
||||
|
||||
if (ivsize == DES_BLOCK_SIZE)
|
||||
memcpy_fromio(req->info, dev->reg + RK_CRYPTO_TDES_IV_0,
|
||||
ivsize);
|
||||
else if (ivsize == AES_BLOCK_SIZE)
|
||||
memcpy_fromio(req->info, dev->reg + RK_CRYPTO_AES_IV_0, ivsize);
|
||||
/* Update the IV buffer to contain the next IV for encryption mode. */
|
||||
if (!(ctx->mode & RK_CRYPTO_DEC)) {
|
||||
if (dev->aligned) {
|
||||
memcpy(req->info, sg_virt(dev->sg_dst) +
|
||||
dev->sg_dst->length - ivsize, ivsize);
|
||||
} else {
|
||||
memcpy(req->info, dev->addr_vir +
|
||||
dev->count - ivsize, ivsize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void rk_update_iv(struct rk_crypto_info *dev)
|
||||
|
|
Loading…
Reference in a new issue