lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 571/717] crypto: ecdh - avoid unaligned accesses in ecdh_set_secret()
    Date
    From: Ard Biesheuvel <ardb@kernel.org>

    commit 17858b140bf49961b71d4e73f1c3ea9bc8e7dda0 upstream.

    ecdh_set_secret() casts a void* pointer to a const u64* in order to
    feed it into ecc_is_key_valid(). This is not generally permitted by
    the C standard, and leads to actual misalignment faults on ARMv6
    cores. In some cases, these are fixed up in software, but this still
    leads to performance hits that are entirely avoidable.

    So let's copy the key into the ctx buffer first, which we will do
    anyway in the common case, and which guarantees correct alignment.

    Cc: <stable@vger.kernel.org>
    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    crypto/ecdh.c | 9 +++++----
    1 file changed, 5 insertions(+), 4 deletions(-)

    --- a/crypto/ecdh.c
    +++ b/crypto/ecdh.c
    @@ -53,12 +53,13 @@ static int ecdh_set_secret(struct crypto
    return ecc_gen_privkey(ctx->curve_id, ctx->ndigits,
    ctx->private_key);

    - if (ecc_is_key_valid(ctx->curve_id, ctx->ndigits,
    - (const u64 *)params.key, params.key_size) < 0)
    - return -EINVAL;
    -
    memcpy(ctx->private_key, params.key, params.key_size);

    + if (ecc_is_key_valid(ctx->curve_id, ctx->ndigits,
    + ctx->private_key, params.key_size) < 0) {
    + memzero_explicit(ctx->private_key, params.key_size);
    + return -EINVAL;
    + }
    return 0;
    }


    \
     
     \ /
      Last update: 2020-12-28 15:44    [W:4.031 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site