Re: [PATCH 1/2] crypto: morus/generic - fix for big endian systems

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Sep 30, 2018 at 10:59 AM Ard Biesheuvel
<ard.biesheuvel@xxxxxxxxxx> wrote:
> Omit the endian swabbing when folding the lengths of the assoc and
> crypt input buffers into the state to finalize the tag. This is not
> necessary given that the memory representation of the state is in
> machine native endianness already.
>
> This fixes an error reported by tcrypt running on a big endian system:
>
>   alg: aead: Test 2 failed on encryption for morus640-generic
>   00000000: a8 30 ef fb e6 26 eb 23 b0 87 dd 98 57 f3 e1 4b
>   00000010: 21
>   alg: aead: Test 2 failed on encryption for morus1280-generic
>   00000000: 88 19 1b fb 1c 29 49 0e ee 82 2f cb 97 a6 a5 ee
>   00000010: 5f

Yikes, I never really got around to test MORUS and AEGIS on a BE
machine...  My mistake, sorry :/

>
> Fixes: 396be41f16fd ("crypto: morus - Add generic MORUS AEAD implementations")
> Cc: <stable@xxxxxxxxxxxxxxx> # v4.18+
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx>

Reviewed-by: Ondrej Mosnacek <omosnace@xxxxxxxxxx>

> ---
>  crypto/morus1280.c |  7 ++-----
>  crypto/morus640.c  | 16 ++++------------
>  2 files changed, 6 insertions(+), 17 deletions(-)
>
> diff --git a/crypto/morus1280.c b/crypto/morus1280.c
> index d057cf5ac4a8..3889c188f266 100644
> --- a/crypto/morus1280.c
> +++ b/crypto/morus1280.c
> @@ -385,14 +385,11 @@ static void crypto_morus1280_final(struct morus1280_state *state,
>                                    struct morus1280_block *tag_xor,
>                                    u64 assoclen, u64 cryptlen)
>  {
> -       u64 assocbits = assoclen * 8;
> -       u64 cryptbits = cryptlen * 8;
> -
>         struct morus1280_block tmp;
>         unsigned int i;
>
> -       tmp.words[0] = cpu_to_le64(assocbits);
> -       tmp.words[1] = cpu_to_le64(cryptbits);
> +       tmp.words[0] = assoclen * 8;
> +       tmp.words[1] = cryptlen * 8;
>         tmp.words[2] = 0;
>         tmp.words[3] = 0;
>
> diff --git a/crypto/morus640.c b/crypto/morus640.c
> index 1ca76e54281b..da06ec2f6a80 100644
> --- a/crypto/morus640.c
> +++ b/crypto/morus640.c
> @@ -384,21 +384,13 @@ static void crypto_morus640_final(struct morus640_state *state,
>                                   struct morus640_block *tag_xor,
>                                   u64 assoclen, u64 cryptlen)
>  {
> -       u64 assocbits = assoclen * 8;
> -       u64 cryptbits = cryptlen * 8;
> -
> -       u32 assocbits_lo = (u32)assocbits;
> -       u32 assocbits_hi = (u32)(assocbits >> 32);
> -       u32 cryptbits_lo = (u32)cryptbits;
> -       u32 cryptbits_hi = (u32)(cryptbits >> 32);
> -
>         struct morus640_block tmp;
>         unsigned int i;
>
> -       tmp.words[0] = cpu_to_le32(assocbits_lo);
> -       tmp.words[1] = cpu_to_le32(assocbits_hi);
> -       tmp.words[2] = cpu_to_le32(cryptbits_lo);
> -       tmp.words[3] = cpu_to_le32(cryptbits_hi);
> +       tmp.words[0] = lower_32_bits(assoclen * 8);
> +       tmp.words[1] = upper_32_bits(assoclen * 8);
> +       tmp.words[2] = lower_32_bits(cryptlen * 8);
> +       tmp.words[3] = upper_32_bits(cryptlen * 8);
>
>         for (i = 0; i < MORUS_BLOCK_WORDS; i++)
>                 state->s[4].words[i] ^= state->s[0].words[i];
> --
> 2.19.0
>

Thanks,

--
Ondrej Mosnacek <omosnace at redhat dot com>
Associate Software Engineer, Security Technologies
Red Hat, Inc.



[Index of Archives]     [Kernel]     [Gnu Classpath]     [Gnu Crypto]     [DM Crypt]     [Netfilter]     [Bugtraq]

  Powered by Linux