[PATCH] ARM: crypto: update NEON AES module to latest OpenSSL version

Ard Biesheuvel ard.biesheuvel at linaro.org
Mon Mar 2 00:26:26 PST 2015


On 28 February 2015 at 22:30, Milan Broz <gmazyland at gmail.com> wrote:
> On 02/26/2015 08:22 AM, Ard Biesheuvel wrote:
>> This updates the bit sliced AES module to the latest version in the
>> upstream OpenSSL repository (e620e5ae37bc). This is needed to fix a
>> bug in the XTS decryption path, where data chunked in a certain way
>> could trigger the ciphertext stealing code, which is not supposed to
>> be active in the kernel build (The kernel implementation of XTS only
>> supports round multiples of the AES block size of 16 bytes, whereas
>> the conformant OpenSSL implementation of XTS supports inputs of
>> arbitrary size by applying ciphertext stealing). This is fixed in
>> the upstream version by adding the missing #ifndef XTS_CHAIN_TWEAK
>> around the offending instructions.
>>
>> The upstream code also contains the change applied by Russell to
>> build the code unconditionally, i.e., even if __LINUX_ARM_ARCH__ < 7,
>> but implemented slightly differently.
>>
>> Fixes: e4e7f10bfc40 ("ARM: add support for bit sliced AES using NEON instructions")
>> Reported-by: Adrian Kotelba <adrian.kotelba at gmail.com>
>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
>> ---
>>
>> This was found using the tcrypt test code, to which I recently added additional
>> chunking modes. However, XTS typically operates on pages or at least on sectors,
>> so this bug is unlikely to affect anyone in real life.
>>
>> Still, please add cc stable when applying,
>
> Please apply it for stable.
>
> For me, this patch fixed bug reported here
>   http://article.gmane.org/gmane.linux.kernel.device-mapper.dm-crypt/7966
>   http://www.mail-archive.com/linux-crypto@vger.kernel.org/msg13102.html
>
> Cryptsetup uses AF_ALG userspace crypto SKCIPHER interface and on
> Raspberry Pi2 with Neon AES implementation it fails to unlock LUKS device
> (if XTS and aes-arm-bs module is used).
>
> After applying this patch it works as expected.
>
> I did not have time to check it more in detail (we are always encrypting
> the whole sector so this should not happen... but apparently it does.)
>
> Tested-by: Milan Broz <gmazyland at gmail.com>
>

OK, thanks for pointing that out, and for confirming that this fixes the issue.

Actually, I did not consider the userspace use case, but it is not
surprising that the data ends up being pushed into the crypto layer in
odd size chunks.

@Herbert: are you ok to take this as a bug fix for stable?

Thanks,
Ard.


>>  arch/arm/crypto/aesbs-core.S_shipped | 12 ++++++++----
>>  arch/arm/crypto/bsaes-armv7.pl       | 12 ++++++++----
>>  2 files changed, 16 insertions(+), 8 deletions(-)
>>
>> diff --git a/arch/arm/crypto/aesbs-core.S_shipped b/arch/arm/crypto/aesbs-core.S_shipped
>> index 71e5fc7cfb18..1d1800f71c5b 100644
>> --- a/arch/arm/crypto/aesbs-core.S_shipped
>> +++ b/arch/arm/crypto/aesbs-core.S_shipped
>> @@ -58,14 +58,18 @@
>>  # define VFP_ABI_FRAME       0
>>  # define BSAES_ASM_EXTENDED_KEY
>>  # define XTS_CHAIN_TWEAK
>> -# define __ARM_ARCH__        7
>> +# define __ARM_ARCH__ __LINUX_ARM_ARCH__
>> +# define __ARM_MAX_ARCH__ 7
>>  #endif
>>
>>  #ifdef __thumb__
>>  # define adrl adr
>>  #endif
>>
>> -#if __ARM_ARCH__>=7
>> +#if __ARM_MAX_ARCH__>=7
>> +.arch        armv7-a
>> +.fpu neon
>> +
>>  .text
>>  .syntax      unified         @ ARMv7-capable assembler is expected to handle this
>>  #ifdef __thumb2__
>> @@ -74,8 +78,6 @@
>>  .code   32
>>  #endif
>>
>> -.fpu neon
>> -
>>  .type        _bsaes_decrypt8,%function
>>  .align       4
>>  _bsaes_decrypt8:
>> @@ -2095,9 +2097,11 @@ bsaes_xts_decrypt:
>>       vld1.8  {q8}, [r0]                      @ initial tweak
>>       adr     r2, .Lxts_magic
>>
>> +#ifndef      XTS_CHAIN_TWEAK
>>       tst     r9, #0xf                        @ if not multiple of 16
>>       it      ne                              @ Thumb2 thing, sanity check in ARM
>>       subne   r9, #0x10                       @ subtract another 16 bytes
>> +#endif
>>       subs    r9, #0x80
>>
>>       blo     .Lxts_dec_short
>> diff --git a/arch/arm/crypto/bsaes-armv7.pl b/arch/arm/crypto/bsaes-armv7.pl
>> index be068db960ee..a4d3856e7d24 100644
>> --- a/arch/arm/crypto/bsaes-armv7.pl
>> +++ b/arch/arm/crypto/bsaes-armv7.pl
>> @@ -701,14 +701,18 @@ $code.=<<___;
>>  # define VFP_ABI_FRAME       0
>>  # define BSAES_ASM_EXTENDED_KEY
>>  # define XTS_CHAIN_TWEAK
>> -# define __ARM_ARCH__        7
>> +# define __ARM_ARCH__ __LINUX_ARM_ARCH__
>> +# define __ARM_MAX_ARCH__ 7
>>  #endif
>>
>>  #ifdef __thumb__
>>  # define adrl adr
>>  #endif
>>
>> -#if __ARM_ARCH__>=7
>> +#if __ARM_MAX_ARCH__>=7
>> +.arch        armv7-a
>> +.fpu neon
>> +
>>  .text
>>  .syntax      unified         @ ARMv7-capable assembler is expected to handle this
>>  #ifdef __thumb2__
>> @@ -717,8 +721,6 @@ $code.=<<___;
>>  .code   32
>>  #endif
>>
>> -.fpu neon
>> -
>>  .type        _bsaes_decrypt8,%function
>>  .align       4
>>  _bsaes_decrypt8:
>> @@ -2076,9 +2078,11 @@ bsaes_xts_decrypt:
>>       vld1.8  {@XMM[8]}, [r0]                 @ initial tweak
>>       adr     $magic, .Lxts_magic
>>
>> +#ifndef      XTS_CHAIN_TWEAK
>>       tst     $len, #0xf                      @ if not multiple of 16
>>       it      ne                              @ Thumb2 thing, sanity check in ARM
>>       subne   $len, #0x10                     @ subtract another 16 bytes
>> +#endif
>>       subs    $len, #0x80
>>
>>       blo     .Lxts_dec_short
>>
>



More information about the linux-arm-kernel mailing list