Skip to content

Commit

Permalink
crypto: sun4i-ss - linearize buffers content must be kept
Browse files Browse the repository at this point in the history
[ Upstream commit 5835135 ]

When running the non-optimized cipher function, SS produce partial random
output.
This is due to linearize buffers being reseted after each loop.

For preserving stack, instead of moving them back to start of function,
I move them in sun4i_ss_ctx.

Fixes: 8d3bcb9 ("crypto: sun4i-ss - reduce stack usage")
Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
montjoie authored and gregkh committed Mar 4, 2021
1 parent 5d93dad commit 99e9cb7
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 8 deletions.
12 changes: 4 additions & 8 deletions drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c
Expand Up @@ -233,8 +233,6 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq)

while (oleft) {
if (ileft) {
char buf[4 * SS_RX_MAX];/* buffer for linearize SG src */

/*
* todo is the number of consecutive 4byte word that we
* can read from current SG
Expand All @@ -256,12 +254,12 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq)
*/
todo = min(rx_cnt * 4 - ob, ileft);
todo = min_t(size_t, todo, mi.length - oi);
memcpy(buf + ob, mi.addr + oi, todo);
memcpy(ss->buf + ob, mi.addr + oi, todo);
ileft -= todo;
oi += todo;
ob += todo;
if (!(ob % 4)) {
writesl(ss->base + SS_RXFIFO, buf,
writesl(ss->base + SS_RXFIFO, ss->buf,
ob / 4);
ob = 0;
}
Expand Down Expand Up @@ -295,13 +293,11 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq)
oo = 0;
}
} else {
char bufo[4 * SS_TX_MAX]; /* buffer for linearize SG dst */

/*
* read obl bytes in bufo, we read at maximum for
* emptying the device
*/
readsl(ss->base + SS_TXFIFO, bufo, tx_cnt);
readsl(ss->base + SS_TXFIFO, ss->bufo, tx_cnt);
obl = tx_cnt * 4;
obo = 0;
do {
Expand All @@ -313,7 +309,7 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq)
*/
todo = min_t(size_t,
mo.length - oo, obl - obo);
memcpy(mo.addr + oo, bufo + obo, todo);
memcpy(mo.addr + oo, ss->bufo + obo, todo);
oleft -= todo;
obo += todo;
oo += todo;
Expand Down
2 changes: 2 additions & 0 deletions drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h
Expand Up @@ -148,6 +148,8 @@ struct sun4i_ss_ctx {
struct reset_control *reset;
struct device *dev;
struct resource *res;
char buf[4 * SS_RX_MAX];/* buffer for linearize SG src */
char bufo[4 * SS_TX_MAX]; /* buffer for linearize SG dst */
spinlock_t slock; /* control the use of the device */
#ifdef CONFIG_CRYPTO_DEV_SUN4I_SS_PRNG
u32 seed[SS_SEED_LEN / BITS_PER_LONG];
Expand Down

0 comments on commit 99e9cb7

Please sign in to comment.