Commit Graph

5 Commits

Author SHA1 Message Date
Prarit Bhargava 96506bf140 lib/crypto: blake2s: avoid indirect calls to compression function for Clang CFI
Bugzilla: https://bugzilla.redhat.com/2079030

commit d2a02e3c8bb6b347818518edff5a4b40ff52d6d8
Author: Jason A. Donenfeld <Jason@zx2c4.com>
Date:   Wed Jan 19 14:35:06 2022 +0100

    lib/crypto: blake2s: avoid indirect calls to compression function for Clang CFI

    blake2s_compress_generic is weakly aliased by blake2s_compress. The
    current harness for function selection uses a function pointer, which is
    ordinarily inlined and resolved at compile time. But when Clang's CFI is
    enabled, CFI still triggers when making an indirect call via a weak
    symbol. This seems like a bug in Clang's CFI, as though it's bucketing
    weak symbols and strong symbols differently. It also only seems to
    trigger when "full LTO" mode is used, rather than "thin LTO".

    [    0.000000][    T0] Kernel panic - not syncing: CFI failure (target: blake2s_compress_generic+0x0/0x1444)
    [    0.000000][    T0] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.16.0-mainline-06981-g076c855b846e #1
    [    0.000000][    T0] Hardware name: MT6873 (DT)
    [    0.000000][    T0] Call trace:
    [    0.000000][    T0]  dump_backtrace+0xfc/0x1dc
    [    0.000000][    T0]  dump_stack_lvl+0xa8/0x11c
    [    0.000000][    T0]  panic+0x194/0x464
    [    0.000000][    T0]  __cfi_check_fail+0x54/0x58
    [    0.000000][    T0]  __cfi_slowpath_diag+0x354/0x4b0
    [    0.000000][    T0]  blake2s_update+0x14c/0x178
    [    0.000000][    T0]  _extract_entropy+0xf4/0x29c
    [    0.000000][    T0]  crng_initialize_primary+0x24/0x94
    [    0.000000][    T0]  rand_initialize+0x2c/0x6c
    [    0.000000][    T0]  start_kernel+0x2f8/0x65c
    [    0.000000][    T0]  __primary_switched+0xc4/0x7be4
    [    0.000000][    T0] Rebooting in 5 seconds..

    Nonetheless, the function pointer method isn't so terrific anyway, so
    this patch replaces it with a simple boolean, which also gets inlined
    away. This successfully works around the Clang bug.

    In general, I'm not too keen on all of the indirection involved here; it
    clearly does more harm than good. Hopefully the whole thing can get
    cleaned up down the road when lib/crypto is overhauled more
    comprehensively. But for now, we go with a simple bandaid.

    Fixes: 6048fdcc5f26 ("lib/crypto: blake2s: include as built-in")
    Link: https://github.com/ClangBuiltLinux/linux/issues/1567
    Reported-by: Miles Chen <miles.chen@mediatek.com>
    Tested-by: Miles Chen <miles.chen@mediatek.com>
    Tested-by: Nathan Chancellor <nathan@kernel.org>
    Tested-by: John Stultz <john.stultz@linaro.org>
    Acked-by: Nick Desaulniers <ndesaulniers@google.com>
    Reviewed-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
2022-04-27 10:48:58 -04:00
Prarit Bhargava 11a695f447 lib/crypto: blake2s: include as built-in
Bugzilla: https://bugzilla.redhat.com/2079030

commit 6048fdcc5f269c7f31d774c295ce59081b36e6f9
Author: Jason A. Donenfeld <Jason@zx2c4.com>
Date:   Wed Dec 22 14:56:58 2021 +0100

    lib/crypto: blake2s: include as built-in

    In preparation for using blake2s in the RNG, we change the way that it
    is wired-in to the build system. Instead of using ifdefs to select the
    right symbol, we use weak symbols. And because ARM doesn't need the
    generic implementation, we make the generic one default only if an arch
    library doesn't need it already, and then have arch libraries that do
    need it opt-in. So that the arch libraries can remain tristate rather
    than bool, we then split the shash part from the glue code.

    Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Masahiro Yamada <masahiroy@kernel.org>
    Cc: linux-kbuild@vger.kernel.org
    Cc: linux-crypto@vger.kernel.org
    Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
2022-04-27 10:48:58 -04:00
Eric Biggers 057edc9c8b crypto: blake2s - move update and final logic to internal/blake2s.h
Move most of blake2s_update() and blake2s_final() into new inline
functions __blake2s_update() and __blake2s_final() in
include/crypto/internal/blake2s.h so that this logic can be shared by
the shash helper functions.  This will avoid duplicating this logic
between the library and shash implementations.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2021-01-03 08:41:38 +11:00
Herbert Xu ce0d5d63e8 crypto: lib/blake2s - Move selftest prototype into header file
This patch fixes a missing prototype warning on blake2s_selftest.

Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2020-12-04 18:13:14 +11:00
Jason A. Donenfeld 66d7fb94e4 crypto: blake2s - generic C library implementation and selftest
The C implementation was originally based on Samuel Neves' public
domain reference implementation but has since been heavily modified
for the kernel. We're able to do compile-time optimizations by moving
some scaffolding around the final function into the header file.

Information: https://blake2.net/

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Samuel Neves <sneves@dei.uc.pt>
Co-developed-by: Samuel Neves <sneves@dei.uc.pt>
[ardb: - move from lib/zinc to lib/crypto
       - remove simd handling
       - rewrote selftest for better coverage
       - use fixed digest length for blake2s_hmac() and rename to
         blake2s256_hmac() ]
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2019-11-17 09:02:42 +08:00