Re: [PATCH v4 00/14] crypto: Adiantum support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Nov 16, 2018 at 05:26:17PM -0800, Eric Biggers wrote:
> Hello,
> 
> We've been working to find a way to bring storage encryption to
> entry-level Android devices like the inexpensive "Android Go" devices
> sold in developing countries, and some smartwatches.  Unfortunately,
> often these devices still ship with no encryption, since for cost
> reasons they have to use older CPUs like ARM Cortex-A7; and these CPUs
> lack the ARMv8 Cryptography Extensions, making AES-XTS much too slow.
> 
> We're trying to change this, since we believe encryption is for
> everyone, not just those who can afford it.  And while it's unknown how
> long CPUs without AES support will be around, there will likely always
> be a "low end"; and in any case it's immensely valuable to provide a
> software-optimized cipher that doesn't depend on hardware support.
> Lack of hardware support should not be an excuse for no encryption.
> 
> But after an extensive search (e.g. see [1]) we were unable to find an
> existing cipher that simultaneously meets the very strict performance
> requirements on ARM processors, is secure (including having sufficient
> security parameters as well as sufficient cryptanalysis of any
> primitive(s) used), is suitable for practical use in dm-crypt and
> fscrypt, *and* avoids any particularly controversial primitive.
> 
> Therefore, we (well, Paul Crowley did the real work) designed a new
> encryption mode, Adiantum.  In essence, Adiantum makes it secure to use
> the ChaCha stream cipher for disk encryption.  Adiantum is specified by
> our paper here: https://eprint.iacr.org/2018/720.pdf ("Adiantum:
> length-preserving encryption for entry-level processors").  Reference
> code and test vectors are here: https://github.com/google/adiantum.
> Most of the high-level concepts of Adiantum are not new; similar
> existing modes include XCB, HCTR, and HCH.  Adiantum and these modes are
> true wide-block modes (tweakable super-pseudorandom permutations), so
> they actually provide a stronger notion of security than XTS.
> 
> Adiantum is an improved version of our previous algorithm, HPolyC [2].
> Like HPolyC, Adiantum uses XChaCha12, two passes of an
> ε-almost-∆-universal (εA∆U) hash function, and one AES-256 encryption of
> a single 16-byte block.  On ARM Cortex-A7, on 4096-byte messages
> Adiantum is about 4x faster than AES-256-XTS (about 5x for decryption),
> and about 30% faster than Speck128/256-XTS.
> 
> Adiantum is a construction, not a primitive.  Its security is reducible
> to that of XChaCha12 and AES-256, subject to a security bound; the proof
> is in Section 5 of our paper.  Therefore, one need not "trust" Adiantum;
> they only need trust XChaCha12 and AES-256.  Note that of these two
> primitives, AES-256 currently has the lower security margin.
> 
> Adiantum is ~20% faster than HPolyC, with no loss of security; in fact,
> Adiantum's security bound is slightly better than HPolyC's.  It does
> this by choosing a faster εA∆U hash function: it still uses Poly1305's
> εA∆U hash function, but now a hash function from the "NH" family of hash
> functions is used to "compress" the message by 32x first.  NH is εAU (as
> shown in the UMAC paper[3]) but is over twice as fast as Poly1305.  Key
> agility is reduced, but that's acceptable for disk encryption.
> 
> NH is also very simple, and it's easy to implement in SIMD assembly,
> e.g. in ARM NEON.  Now, to get good performance only a SIMD
> implementation of NH is required, not Poly1305.  Therefore, Adiantum can
> be easier to port to new platforms than HPolyC, despite Adiantum's
> slightly increased complexity.  For now this patchset only includes an
> ARM32 NEON implementation of NH, but as a proof of concept I've also
> written SSE2, AVX2, and ARM64 NEON implementations of NH; see
> https://github.com/google/adiantum/tree/master/benchmark/src.
> 
> This patchset adds Adiantum to Linux's crypto API, focusing on generic
> and ARM32 implementations.  Patches 1-9 add support for XChaCha20 and
> XChaCha12.  Patches 10-13 add NHPoly1305 support, needed for Adiantum
> hashing.  Patch 14 adds Adiantum support as a skcipher template.
> 
> This patchset applies to cryptodev.  It can also be found in git at
> branch "adiantum-v4" of:
> https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git
> 
> With this patchset, Adiantum is already usable in dm-crypt via the
> "capi:" cipher syntax.  I'll also be adding Adiantum support to fscrypt
> via the patch https://patchwork.kernel.org/patch/10669339/, but I
> dropped it from this series for now since it will be taken through the
> fscrypt git tree instead.  Note that in fscrypt, Adiantum will also fix
> an information leak in filenames encryption when filenames share a
> common prefix, and Adiantum's long IV support make it safe to use the
> same key for many files, improving performance even more.
> 
> Again, for more details please read our paper:
> 
>     Adiantum: length-preserving encryption for entry-level processors
>     (https://eprint.iacr.org/2018/720.pdf)
> 
> References:
>   [1] https://www.spinics.net/lists/linux-crypto/msg33000.html
>   [2] https://patchwork.kernel.org/cover/10558059/
>   [3] https://fastcrypto.org/umac/umac_proc.pdf
> 
> Changed since v3:
>   - Rebase onto cryptodev because of recent ChaCha20 changes.
>   - Drop fscrypt patch; I'm sending it as a standalone patch.
> 
> Changed since v2:
>   - Simplify the generic NH implementation.
>   - Add patches to reduce atomic walks and disabling preemption.
>   - Split Poly1305 changes into two patches.
>   - Add tcrypt test mode for Adiantum.
>   - Make NEON 'chacha_permute' a function rather than a macro.
>   - Use .base.* style when declaring algorithms.
>   - Replace BUG_ON() in chacha_permute() with WARN_ON_ONCE().
>   - Set Adiantum instance {min,max}_keysize correctly in all cases.
>   - Make the Adiantum template take the nhpoly1305 driver name as
>     optional third argument (useful for testing).
> 
>   Thanks to Ard Biesheuvel for reviewing the patches.
> 
> Changed since v1:
>   - Replace HPolyC with Adiantum (uses a faster hash function).
>   - Drop ARM accelerated Poly1305.
>   - Add fscrypt patch.
> 
> Eric Biggers (14):
>   crypto: chacha20-generic - add HChaCha20 library function
>   crypto: chacha20-generic - don't unnecessarily use atomic walk
>   crypto: chacha20-generic - add XChaCha20 support
>   crypto: chacha20-generic - refactor to allow varying number of rounds
>   crypto: chacha - add XChaCha12 support
>   crypto: arm/chacha20 - limit the preemption-disabled section
>   crypto: arm/chacha20 - add XChaCha20 support
>   crypto: arm/chacha20 - refactor to allow varying number of rounds
>   crypto: arm/chacha - add XChaCha12 support
>   crypto: poly1305 - use structures for key and accumulator
>   crypto: poly1305 - add Poly1305 core API
>   crypto: nhpoly1305 - add NHPoly1305 support
>   crypto: arm/nhpoly1305 - add NEON-accelerated NHPoly1305
>   crypto: adiantum - add Adiantum support
> 
>  arch/arm/crypto/Kconfig                       |    7 +-
>  arch/arm/crypto/Makefile                      |    6 +-
>  ...hacha20-neon-core.S => chacha-neon-core.S} |   98 +-
>  arch/arm/crypto/chacha-neon-glue.c            |  201 ++
>  arch/arm/crypto/chacha20-neon-glue.c          |  127 -
>  arch/arm/crypto/nh-neon-core.S                |  116 +
>  arch/arm/crypto/nhpoly1305-neon-glue.c        |   77 +
>  arch/arm64/crypto/chacha20-neon-glue.c        |   40 +-
>  arch/x86/crypto/chacha20_glue.c               |   48 +-
>  arch/x86/crypto/poly1305_glue.c               |   20 +-
>  crypto/Kconfig                                |   46 +-
>  crypto/Makefile                               |    4 +-
>  crypto/adiantum.c                             |  658 ++++
>  crypto/chacha20_generic.c                     |  137 -
>  crypto/chacha20poly1305.c                     |   10 +-
>  crypto/chacha_generic.c                       |  217 ++
>  crypto/nhpoly1305.c                           |  254 ++
>  crypto/poly1305_generic.c                     |  174 +-
>  crypto/tcrypt.c                               |   12 +
>  crypto/testmgr.c                              |   30 +
>  crypto/testmgr.h                              | 2856 ++++++++++++++++-
>  drivers/char/random.c                         |   51 +-
>  drivers/crypto/caam/caamalg.c                 |    2 +-
>  drivers/crypto/caam/caamalg_qi2.c             |    8 +-
>  drivers/crypto/caam/compat.h                  |    2 +-
>  include/crypto/chacha.h                       |   54 +
>  include/crypto/chacha20.h                     |   28 -
>  include/crypto/nhpoly1305.h                   |   74 +
>  include/crypto/poly1305.h                     |   28 +-
>  lib/Makefile                                  |    2 +-
>  lib/{chacha20.c => chacha.c}                  |   59 +-
>  31 files changed, 4931 insertions(+), 515 deletions(-)
>  rename arch/arm/crypto/{chacha20-neon-core.S => chacha-neon-core.S} (90%)
>  create mode 100644 arch/arm/crypto/chacha-neon-glue.c
>  delete mode 100644 arch/arm/crypto/chacha20-neon-glue.c
>  create mode 100644 arch/arm/crypto/nh-neon-core.S
>  create mode 100644 arch/arm/crypto/nhpoly1305-neon-glue.c
>  create mode 100644 crypto/adiantum.c
>  delete mode 100644 crypto/chacha20_generic.c
>  create mode 100644 crypto/chacha_generic.c
>  create mode 100644 crypto/nhpoly1305.c
>  create mode 100644 include/crypto/chacha.h
>  delete mode 100644 include/crypto/chacha20.h
>  create mode 100644 include/crypto/nhpoly1305.h
>  rename lib/{chacha20.c => chacha.c} (58%)

All applied.  Thanks.
-- 
Email: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt



[Index of Archives]     [Kernel]     [Gnu Classpath]     [Gnu Crypto]     [DM Crypt]     [Netfilter]     [Bugtraq]

  Powered by Linux