Arnd Bergmann
unread,Sep 23, 2020, 10:00:54 AM9/23/20Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to Corentin Labbe, David Miller, Herbert Xu, Maxime Ripard, Chen-Yu Tsai, Linux ARM, open list:HARDWARE RANDOM NUMBER GENERATOR CORE, linux-...@vger.kernel.org, linux-sunxi, # 3.4.x
On Sun, Sep 20, 2020 at 8:37 PM Corentin Labbe <
cla...@baylibre.com> wrote:
>
> Ciphers produce invalid results on BE.
> Key and IV need to be written in LE.
>
> drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c
> index c6c25204780d..a05889745097 100644
> --- a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c
> +++ b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c
> @@ -52,13 +52,13 @@ static int noinline_for_stack sun4i_ss_opti_poll(struct skcipher_request *areq)
>
> spin_lock_irqsave(&ss->slock, flags);
>
> - for (i = 0; i < op->keylen; i += 4)
> - writel(*(op->key + i / 4), ss->base + SS_KEY0 + i);
> + for (i = 0; i < op->keylen / 4; i++)
> + writel(cpu_to_le32(op->key[i]), ss->base + SS_KEY0 + i * 4);
I suspect what you actually want here is writesl() in place of the
loop. This skips the byteswap on big-endian, rather than swapping
each word twice.
The point is that this register seems to act as a FIFO for a byte-stream
rather than a 32-bit fixed-endian register.
Arnd