Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp645148img; Fri, 22 Mar 2019 05:49:52 -0700 (PDT) X-Google-Smtp-Source: APXvYqwN+iUMHeusYvW2HsQTQYp4hEhLCo99l6NiLm86fk+/XDHj8zsL/UPZqu6whu8F8FHYJiQ2 X-Received: by 2002:aa7:8249:: with SMTP id e9mr8933136pfn.6.1553258992795; Fri, 22 Mar 2019 05:49:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553258992; cv=none; d=google.com; s=arc-20160816; b=Z9uD7WdOiB4uNiHJd16B7TiA0x3NLrzc7H4bKI3W4uvjTTRV+9XInOvx1o9cquHfLs NjYfSyzh2eHCS7ulcmkZklWxDuNXUtisd21teKpu4XARochWfstNnwip+x6XpeBZyWpN 4cF2s8Z3ZMsjjdCLvIzZgRJZMdy/QVMrhWtQiRCqXi3DYTiGoeSvzbdOlAi87lzBPh9A wtiykGBOk4trUhq//UVxxCDWECmkutJO8X0U5xovqmTYI/UV3j6N7tpt7TNlqyP2a7WM 2lGmsRpQJOXuvX1SXXsHwBkhlH1V1mHNMyhBpQt00QxkWoDff0V+kchS8CXeuTwpcE2G NHVw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=R6vEHMDB6Syt/gjRt4fbEkdZ/MUmXaqT8oeODn4CLeI=; b=weuqUlGZepwi7ACwK7VCNBAuxolRM3045AfB68ckXNDJhZltRFfh2MwSfw1REYD5EG AEqcUoow+r0p3MUAbaXghJDCA0uFdyekEMoWgnZfo/qZ0gScLko8lFOYwFzrgjeH3Owk 1p+SKTJTFPa/z4MwaUXJ3jF8vvcv586AFog0eBO50vKJGx52SNyWa6Rsf6d0DA5Giuj8 hcKJAmAnSH4rKbu8PGvPPOcv7+UEwwOQ7qVIu8T66T+RERkDrjrDVxBnYDJBIwydooyr MmCSH0F4D+uJuxIyuAeJ0t8q1av+6gF+qQgU5KntnbKm9muMV3nzblbwH49cv+i09Zmk Yqpw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=v6rbNTcn; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 70si7208411pla.128.2019.03.22.05.49.37; Fri, 22 Mar 2019 05:49:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=v6rbNTcn; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732305AbfCVMru (ORCPT + 99 others); Fri, 22 Mar 2019 08:47:50 -0400 Received: from mail.kernel.org ([198.145.29.99]:34412 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387727AbfCVL5w (ORCPT ); Fri, 22 Mar 2019 07:57:52 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id AE8B22192D; Fri, 22 Mar 2019 11:57:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1553255871; bh=i1pblu8DiG3TVh9UAicxNnzeJYoVipUxCpIl/KLYDUU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=v6rbNTcncoxovrG7QfJsYNsImxOvTx8XeUdkNxieCYTJjwh0ukH7RI2Nr0GH+kkqi Q3Z+wcA4kOxhny1/byACMqGVXG1wSX+qyTJkP/EBvD6B3cElkuJ8kQTzZNr6tCv7Nu HXsd4jYl6zBCM1QB7SHbjoz0b4BTOet7ucIfDBFg= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Eric Biggers , Zhang Zhijie , Herbert Xu Subject: [PATCH 4.19 022/280] crypto: rockchip - update new iv to device in multiple operations Date: Fri, 22 Mar 2019 12:12:55 +0100 Message-Id: <20190322111307.544337979@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190322111306.356185024@linuxfoundation.org> References: <20190322111306.356185024@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ From: Zhang Zhijie commit c1c214adcb56d36433480c8fedf772498e7e539c upstream. For chain mode in cipher(eg. AES-CBC/DES-CBC), the iv is continuously updated in the operation. The new iv value should be written to device register by software. Reported-by: Eric Biggers Fixes: 433cd2c617bf ("crypto: rockchip - add crypto driver for rk3288") Cc: # v4.5+ Signed-off-by: Zhang Zhijie Signed-off-by: Herbert Xu Signed-off-by: Greg Kroah-Hartman --- drivers/crypto/rockchip/rk3288_crypto.h | 1 drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c | 34 +++++++++++++++++++++ 2 files changed, 35 insertions(+) --- a/drivers/crypto/rockchip/rk3288_crypto.h +++ b/drivers/crypto/rockchip/rk3288_crypto.h @@ -245,6 +245,7 @@ struct rk_cipher_ctx { struct rk_crypto_info *dev; unsigned int keylen; u32 mode; + u8 iv[AES_BLOCK_SIZE]; }; enum alg_type { --- a/drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c +++ b/drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c @@ -242,6 +242,17 @@ static void crypto_dma_start(struct rk_c static int rk_set_data_start(struct rk_crypto_info *dev) { int err; + 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); + 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) + memcpy(ctx->iv, src_last_blk, ivsize); err = dev->load_data(dev, dev->sg_src, dev->sg_dst); if (!err) @@ -286,6 +297,28 @@ static void rk_iv_copyback(struct rk_cry memcpy_fromio(req->info, dev->reg + RK_CRYPTO_AES_IV_0, ivsize); } +static void rk_update_iv(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); + u8 *new_iv = NULL; + + if (ctx->mode & RK_CRYPTO_DEC) { + new_iv = ctx->iv; + } else { + new_iv = page_address(sg_page(dev->sg_dst)) + + dev->sg_dst->offset + dev->sg_dst->length - ivsize; + } + + if (ivsize == DES_BLOCK_SIZE) + memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, new_iv, ivsize); + else if (ivsize == AES_BLOCK_SIZE) + memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, new_iv, ivsize); +} + /* return: * true some err was occurred * fault no err, continue @@ -307,6 +340,7 @@ static int rk_ablk_rx(struct rk_crypto_i } } if (dev->left_bytes) { + rk_update_iv(dev); if (dev->aligned) { if (sg_is_last(dev->sg_src)) { dev_err(dev->dev, "[%s:%d] Lack of data\n",