summaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--crypto/morus1280.c7
-rw-r--r--crypto/morus640.c16
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,
385 struct morus1280_block *tag_xor, 385 struct morus1280_block *tag_xor,
386 u64 assoclen, u64 cryptlen) 386 u64 assoclen, u64 cryptlen)
387{ 387{
388 u64 assocbits = assoclen * 8;
389 u64 cryptbits = cryptlen * 8;
390
391 struct morus1280_block tmp; 388 struct morus1280_block tmp;
392 unsigned int i; 389 unsigned int i;
393 390
394 tmp.words[0] = cpu_to_le64(assocbits); 391 tmp.words[0] = assoclen * 8;
395 tmp.words[1] = cpu_to_le64(cryptbits); 392 tmp.words[1] = cryptlen * 8;
396 tmp.words[2] = 0; 393 tmp.words[2] = 0;
397 tmp.words[3] = 0; 394 tmp.words[3] = 0;
398 395
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];