summaryrefslogtreecommitdiffstats
path: root/crypto/morus640.c
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2018-10-01 04:36:37 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2018-10-08 01:44:53 -0400
commit5a8dedfa3276e88c5865f265195d63d72aec3e72 (patch)
treecd847d1a7001bb85e18199fe7848a8d454a8b463 /crypto/morus640.c
parentfd27b571c9f6cf95ddbdf9de7cf0aa8c8cfe8066 (diff)
crypto: morus/generic - fix for big endian systems
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 Fixes: 396be41f16fd ("crypto: morus - Add generic MORUS AEAD implementations") Cc: <stable@vger.kernel.org> # v4.18+ Reviewed-by: Ondrej Mosnacek <omosnace@redhat.com> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/morus640.c')
-rw-r--r--crypto/morus640.c16
1 files changed, 4 insertions, 12 deletions
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,
384 struct morus640_block *tag_xor, 384 struct morus640_block *tag_xor,
385 u64 assoclen, u64 cryptlen) 385 u64 assoclen, u64 cryptlen)
386{ 386{
387 u64 assocbits = assoclen * 8;
388 u64 cryptbits = cryptlen * 8;
389
390 u32 assocbits_lo = (u32)assocbits;
391 u32 assocbits_hi = (u32)(assocbits >> 32);
392 u32 cryptbits_lo = (u32)cryptbits;
393 u32 cryptbits_hi = (u32)(cryptbits >> 32);
394
395 struct morus640_block tmp; 387 struct morus640_block tmp;
396 unsigned int i; 388 unsigned int i;
397 389
398 tmp.words[0] = cpu_to_le32(assocbits_lo); 390 tmp.words[0] = lower_32_bits(assoclen * 8);
399 tmp.words[1] = cpu_to_le32(assocbits_hi); 391 tmp.words[1] = upper_32_bits(assoclen * 8);
400 tmp.words[2] = cpu_to_le32(cryptbits_lo); 392 tmp.words[2] = lower_32_bits(cryptlen * 8);
401 tmp.words[3] = cpu_to_le32(cryptbits_hi); 393 tmp.words[3] = upper_32_bits(cryptlen * 8);
402 394
403 for (i = 0; i < MORUS_BLOCK_WORDS; i++) 395 for (i = 0; i < MORUS_BLOCK_WORDS; i++)
404 state->s[4].words[i] ^= state->s[0].words[i]; 396 state->s[4].words[i] ^= state->s[0].words[i];