17 Nov, 2019

2 commits

  • Arnd reports that the 32-bit generic library code for Curve25119 ends
    up using an excessive amount of stack space when built with Clang:

    lib/crypto/curve25519-fiat32.c:756:6: error: stack frame size
    of 1384 bytes in function 'curve25519_generic'
    [-Werror,-Wframe-larger-than=]

    Let's give some hints to the compiler regarding which routines should
    not be inlined, to prevent it from running out of registers and spilling
    to the stack. The resulting code performs identically under both GCC
    and Clang, and makes the warning go away.

    Suggested-by: Arnd Bergmann
    Signed-off-by: Ard Biesheuvel
    Signed-off-by: Herbert Xu

    Ard Biesheuvel
     
  • This contains two formally verified C implementations of the Curve25519
    scalar multiplication function, one for 32-bit systems, and one for
    64-bit systems whose compiler supports efficient 128-bit integer types.
    Not only are these implementations formally verified, but they are also
    the fastest available C implementations. They have been modified to be
    friendly to kernel space and to be generally less horrendous looking,
    but still an effort has been made to retain their formally verified
    characteristic, and so the C might look slightly unidiomatic.

    The 64-bit version comes from HACL*: https://github.com/project-everest/hacl-star
    The 32-bit version comes from Fiat: https://github.com/mit-plv/fiat-crypto

    Information: https://cr.yp.to/ecdh.html

    Signed-off-by: Jason A. Donenfeld
    [ardb: - move from lib/zinc to lib/crypto
    - replace .c #includes with Kconfig based object selection
    - drop simd handling and simplify support for per-arch versions ]
    Signed-off-by: Ard Biesheuvel
    Signed-off-by: Herbert Xu

    Jason A. Donenfeld