summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Biggers <ebiggers@google.com>2019-02-01 02:51:42 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2019-02-08 02:30:08 -0500
commit12455e320e19e9cc7ad97f4ab89c280fe297387c (patch)
treecdacd4ffb49119d01c1b14e69210c811c9aab9ae
parent77568e535af7c4f97eaef1e555bf0af83772456c (diff)
crypto: arm64/aes-neonbs - fix returning final keystream block
The arm64 NEON bit-sliced implementation of AES-CTR fails the improved skcipher tests because it sometimes produces the wrong ciphertext. The bug is that the final keystream block isn't returned from the assembly code when the number of non-final blocks is zero. This can happen if the input data ends a few bytes after a page boundary. In this case the last bytes get "encrypted" by XOR'ing them with uninitialized memory. Fix the assembly code to return the final keystream block when needed. Fixes: 88a3f582bea9 ("crypto: arm64/aes - don't use IV buffer to return final keystream block") Cc: <stable@vger.kernel.org> # v4.11+ Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--arch/arm64/crypto/aes-neonbs-core.S8
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/arm64/crypto/aes-neonbs-core.S b/arch/arm64/crypto/aes-neonbs-core.S
index e613a87f8b53..8432c8d0dea6 100644
--- a/arch/arm64/crypto/aes-neonbs-core.S
+++ b/arch/arm64/crypto/aes-neonbs-core.S
@@ -971,18 +971,22 @@ CPU_LE( rev x8, x8 )
971 971
9728: next_ctr v0 9728: next_ctr v0
973 st1 {v0.16b}, [x24] 973 st1 {v0.16b}, [x24]
974 cbz x23, 0f 974 cbz x23, .Lctr_done
975 975
976 cond_yield_neon 98b 976 cond_yield_neon 98b
977 b 99b 977 b 99b
978 978
9790: frame_pop 979.Lctr_done:
980 frame_pop
980 ret 981 ret
981 982
982 /* 983 /*
983 * If we are handling the tail of the input (x6 != NULL), return the 984 * If we are handling the tail of the input (x6 != NULL), return the
984 * final keystream block back to the caller. 985 * final keystream block back to the caller.
985 */ 986 */
9870: cbz x25, 8b
988 st1 {v0.16b}, [x25]
989 b 8b
9861: cbz x25, 8b 9901: cbz x25, 8b
987 st1 {v1.16b}, [x25] 991 st1 {v1.16b}, [x25]
988 b 8b 992 b 8b