All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Biggers <ebiggers@kernel.org>
To: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: linux-crypto@vger.kernel.org, herbert@gondor.apana.org.au
Subject: Re: [PATCH v2 00/26]crypto: AES cleanup
Date: Tue, 25 Jun 2019 21:11:55 -0700	[thread overview]
Message-ID: <20190626041155.GC745@sol.localdomain> (raw)
In-Reply-To: <20190622193427.20336-1-ard.biesheuvel@linaro.org>

On Sat, Jun 22, 2019 at 09:34:01PM +0200, Ard Biesheuvel wrote:
> This started out as an attempt to provide synchronous SIMD based GCM
> on 32-bit ARM, but along the way, I ended up changing and cleaning up
> so many things that it is more of a general AES cleanup now rather than
> anything else.
> 
> Changes since v1/RFC:
> - rename x86 AES-NI and padlock routines as well, in order to avoid clashes (#2)
> - move irq en/disabling out of the AES library into the callers (aes-ti
>   and the skcipher helper for sync ctr(aes) added in #17)
> - align 32-bit ARM CE key schedule endianness with other AES drivers, to
>   avoid problems on BE systems when using the synchronous ctr fallback (#18)
> - replace some occurrences where a "aes" or "aes-generic" cipher was allocated
>   explicitly, and use library calls instead.
> - use a generic helper in crypto/ctr.h instead of adding a CTR helper to the
>   AES library for providing the synchronous CTR fallback code.
> 
> Some users of the AES cipher are being switched to other algorithms (i.e.,
> SipHash for TCP fastopen and CCM or cbcmac for wusb and lib80211). These
> have been posted separately, since they have no build time interdependencies.
> 
> ----- Original blurb below ------
> 
> On 32-bit ARM, asynchronous GCM can be provided by the following drivers:
> 
>                                               |  cycles per byte on low end Si
>   gcm_base(ctr(aes-generic),ghash-generic)    |            65.3
>   gcm_base(ctr-aes-neonbs,ghash-ce) [*]       |            27.7
>   gcm_base(ctr-aes-ce,ghash-ce) [**]          |             3.7
> 
>   [*]  ghash-ce using vmull.p8 instructions
>   [**] ghash-ce using optional vmull.p64 instructions
> 
> The third and fastest option is actually only available on 32-bit cores that
> implement the v8 Crypto Extensions, which are rare, but the NEON based runner
> up is obviously a huge improvement over the generic code, not only in terms of
> performance, but also because it is time invariant (generic AES and generic
> GHASH are both implemented using lookup tables, which are susceptible to
> cache timing attacks)
> 
> However, when allocating the gcm(aes) skcipher in synchronous mode, we end up
> with the generic code, due to the fact that the NEON code has no handling for
> invocations that occur from a context where the NEON cannot be used, and so
> it defers the processing to a kthread, which is only permitted for asynchronous
> ciphers.
> 
> So let's implement this fallback handling, by reusing some of the logic that
> has already been implemented for arm64. Note that these fallbacks are rarely
> called in practice, but the API requires the functionality to be there.
> This is implemented in patches 16-22.
> 
> All the patches leading up to that are cleanups for the AES code, to reduce
> the dependency on the generic table based AES code, or in some cases, hardcoded
> dependencies on the scalar arm64 asm code which suffers from the same problem.
> It also removes redundant key expansion routines, and gets rid of the x86
> scalar asm code, which is a maintenance burden and is not actually faster than
> the generic code built with a modern compiler.
> 
> Ard Biesheuvel (26):
>   crypto: arm/aes-ce - cosmetic/whitespace cleanup
>   crypto: aes - rename local routines to prevent future clashes
>   crypto: aes/fixed-time - align key schedule with other implementations
>   crypto: aes - create AES library based on the fixed time AES code
>   crypto: x86/aes-ni - switch to generic for fallback and key routines
>   crypto: x86/aes - drop scalar assembler implementations
>   crypto: padlock/aes - switch to library version of key expansion
>     routine
>   crypto: cesa/aes - switch to library version of key expansion routine
>   crypto: safexcel/aes - switch to library version of key expansion
>     routine
>   crypto: arm64/ghash - switch to AES library
>   crypto: arm/aes-neonbs - switch to library version of key expansion
>     routine
>   crypto: arm64/aes-ccm - switch to AES library
>   crypto: arm64/aes-neonbs - switch to library version of key expansion
>     routine
>   crypto: arm64/aes-ce - switch to library version of key expansion
>     routine
>   crypto: generic/aes - drop key expansion routine in favor of library
>     version
>   crypto: ctr - add helper for performing a CTR encryption walk
>   crypto: aes - move sync ctr(aes) to AES library and generic helper
>   crypto: arm64/aes-ce-cipher - use AES library as fallback
>   crypto: aes/arm - use native endiannes for key schedule
>   crypto: arm/aes-ce - provide a synchronous version of ctr(aes)
>   crypto: arm/aes-neonbs - provide a synchronous version of ctr(aes)
>   crypto: arm/ghash - provide a synchronous version
>   bluetooth: switch to AES library
>   crypto: amcc/aes - switch to AES library for GCM key derivation
>   crypto: ccp - move to AES library for CMAC key derivation
>   crypto: chelsio/aes - replace AES cipher calls with library calls
> 

I'm seeing the following self-tests failures with this patchset applied:

On arm32:

[   20.956118] alg: skcipher: ctr-aes-ce-sync encryption test failed (wrong result) on test vector 0, cfg="random: inplace use_digest nosimd src_divs=[100.0%@+3650] iv_offset=9"
[   28.344185] alg: skcipher: ctr-aes-neonbs-sync encryption test failed (wrong result) on test vector 0, cfg="random: inplace use_final nosimd src_divs=[16.88%@+3, <flush>39.11%@+1898, <reimport>44.1%@+5] iv_offset=13"

On arm64:

[   15.528433] alg: skcipher: ctr-aes-ce encryption test failed (wrong result) on test vector 0, cfg="random: use_digest nosimd src_divs=[100.0%@+4078]"
[   20.080914] alg: skcipher: ctr-aes-neon encryption test failed (wrong result) on test vector 0, cfg="random: inplace use_final nosimd src_divs=[50.90%@+255, <flush,nosimd>49.10%@+25]"

Maybe a bug in crypto_ctr_encrypt_walk()?

- Eric

  parent reply	other threads:[~2019-06-26  4:11 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-22 19:34 [PATCH v2 00/26]crypto: AES cleanup Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 01/26] crypto: arm/aes-ce - cosmetic/whitespace cleanup Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 02/26] crypto: aes - rename local routines to prevent future clashes Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 03/26] crypto: aes/fixed-time - align key schedule with other implementations Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 04/26] crypto: aes - create AES library based on the fixed time AES code Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 05/26] crypto: x86/aes-ni - switch to generic for fallback and key routines Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 06/26] crypto: x86/aes - drop scalar assembler implementations Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 07/26] crypto: padlock/aes - switch to library version of key expansion routine Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 08/26] crypto: cesa/aes " Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 09/26] crypto: safexcel/aes " Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 10/26] crypto: arm64/ghash - switch to AES library Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 11/26] crypto: arm/aes-neonbs - switch to library version of key expansion routine Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 12/26] crypto: arm64/aes-ccm - switch to AES library Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 13/26] crypto: arm64/aes-neonbs - switch to library version of key expansion routine Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 14/26] crypto: arm64/aes-ce " Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 15/26] crypto: generic/aes - drop key expansion routine in favor of library version Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 16/26] crypto: ctr - add helper for performing a CTR encryption walk Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 17/26] crypto: aes - move sync ctr(aes) to AES library and generic helper Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 18/26] crypto: arm64/aes-ce-cipher - use AES library as fallback Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 19/26] crypto: aes/arm - use native endiannes for key schedule Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 20/26] crypto: arm/aes-ce - provide a synchronous version of ctr(aes) Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 21/26] crypto: arm/aes-neonbs " Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 22/26] crypto: arm/ghash - provide a synchronous version Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 23/26] bluetooth: switch to AES library Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 24/26] crypto: amcc/aes - switch to AES library for GCM key derivation Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 25/26] crypto: ccp - move to AES library for CMAC " Ard Biesheuvel
2019-06-22 19:34 ` [PATCH v2 26/26] crypto: chelsio/aes - replace AES cipher calls with library calls Ard Biesheuvel
2019-06-26  4:11 ` Eric Biggers [this message]
2019-06-27 10:03   ` [PATCH v2 00/26]crypto: AES cleanup Ard Biesheuvel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190626041155.GC745@sol.localdomain \
    --to=ebiggers@kernel.org \
    --cc=ard.biesheuvel@linaro.org \
    --cc=herbert@gondor.apana.org.au \
    --cc=linux-crypto@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.