Patch "crypto: arm64/aes-ce - fix for big endian" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
crypto: arm64/aes-ce - fix for big endian
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
crypto-arm64-aes-ce-fix-for-big-endian.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
1803b9a52c4e5a5dbb8a27126f6bc06939359753Mon Sep 17 00:00:00 2001
From: Ard Biesheuvel <[email protected]>
Date: Tue, 11 Oct 2016 19:15:13 +0100
Subject: crypto: arm64/aes-ce - fix for big endian
From: Ard Biesheuvel <[email protected]>
commit 1803b9a52c4e5a5dbb8a27126f6bc06939359753 upstream.
The core AES cipher implementation that uses ARMv8 Crypto Extensions instructions erroneously loads the round keys as 64-bit quantities, which causes the algorithm to fail when built for big endian. In addition, the key schedule generation routine fails to take endianness into account as well, when loading the combining the input key with the round constants. So fix both issues.
--- arch/arm64/crypto/aes-ce-cipher.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-)
arch/arm64/crypto/aes-ce-cipher.c +15 -10
@@ -47,24 +47,24 @@ static void aes_cipher_encrypt(struct crkernel_neon_begin_partial (4 ); __asm__(" ld1 {v0.16b}, %[in] ;" -" ld1 {v1.2d}, [%[key]], #16 ;" +" ld1 {v1.16b}, [%[key]], #16 ;" " cmp %w[rounds], #10 ;" " bmi 0f ;" " bne 3f ;" " mov v3.16b, v1.16b ;" " b 2f ;" "0: mov v2.16b, v1.16b ;" -" ld1 {v3.2d}, [%[key]], #16 ;" +" ld1 {v3.16b}, [%[key]], #16 ;" "1: aese v0.16b, v2.16b ;" " aesmc v0.16b, v0.16b ;" -"2: ld1 {v1.2d}, [%[key]], #16 ;" +"2: ld1 {v1.16b}, [%[key]], #16 ;" " aese v0.16b, v3.16b ;" " aesmc v0.16b, v0.16b ;" -"3: ld1 {v2.2d}, [%[key]], #16 ;" +"3: ld1 {v2.16b}, [%[key]], #16 ;" " subs %w[rounds], %w[rounds], #3 ;" " aese v0.16b, v1.16b ;" " aesmc v0.16b, v0.16b ;" -" ld1 {v3.2d}, [%[key]], #16 ;" +" ld1 {v3.16b}, [%[key]], #16 ;" " bpl 1b ;" " aese v0.16b, v2.16b ;" " eor v0.16b, v0.16b, v3.16b ;"
@@ -92,24 +92,24 @@ static void aes_cipher_decrypt(struct crkernel_neon_begin_partial (4 ); __asm__(" ld1 {v0.16b}, %[in] ;" -" ld1 {v1.2d}, [%[key]], #16 ;" +" ld1 {v1.16b}, [%[key]], #16 ;" " cmp %w[rounds], #10 ;" " bmi 0f ;" " bne 3f ;" " mov v3.16b, v1.16b ;" " b 2f ;" "0: mov v2.16b, v1.16b ;" -" ld1 {v3.2d}, [%[key]], #16 ;" +" ld1 {v3.16b}, [%[key]], #16 ;" "1: aesd v0.16b, v2.16b ;" " aesimc v0.16b, v0.16b ;" -"2: ld1 {v1.2d}, [%[key]], #16 ;" +"2: ld1 {v1.16b}, [%[key]], #16 ;" " aesd v0.16b, v3.16b ;" " aesimc v0.16b, v0.16b ;" -"3: ld1 {v2.2d}, [%[key]], #16 ;" +"3: ld1 {v2.16b}, [%[key]], #16 ;" " subs %w[rounds], %w[rounds], #3 ;" " aesd v0.16b, v1.16b ;" " aesimc v0.16b, v0.16b ;" -" ld1 {v3.2d}, [%[key]], #16 ;" +" ld1 {v3.16b}, [%[key]], #16 ;" " bpl 1b ;" " aesd v0.16b, v2.16b ;" " eor v0.16b, v0.16b, v3.16b ;"
@@ -173,7 +173,12 @@ int ce_aes_expandkey(struct crypto_aes_cu32 *rki = ctx->key_enc + (i * kwords);u32 *rko = rki + kwords; +#ifndef CONFIG_CPU_BIG_ENDIAN rko[0 ] =ror32 (aes_sub (rki[kwords -1 ]),8 ) ^ rcon[i] ^ rki[0 ]; +#else + rko[0 ] =rol32 (aes_sub (rki[kwords -1 ]),8 ) ^ (rcon[i] <<24 ) ^ + rki[0 ]; +#endif rko[1 ] = rko[0 ] ^ rki[1 ]; rko[2 ] = rko[1 ] ^ rki[2 ]; rko[3 ] = rko[2 ] ^ rki[3 ];
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/crypto-arm64-aes-neon-fix-for-big-endian.patch queue-4.4/crypto-arm64-ghash-ce-fix-for-big-endian.patch queue-4.4/crypto-arm64-aes-ce-fix-for-big-endian.patch queue-4.4/crypto-arm64-aes-xts-ce-fix-for-big-endian.patch queue-4.4/crypto-arm-aes-ce-fix-for-big-endian.patch queue-4.4/crypto-arm64-aes-ccm-ce-fix-for-big-endian.patch queue-4.4/crypto-arm64-sha2-ce-fix-for-big-endian.patch queue-4.4/crypto-arm64-sha1-ce-fix-for-big-endian.patch