lkml.org 
[lkml]   [2018]   [Aug]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v7 6/9] crypto alg: Introduce generic max blocksize and alignmask
    Date
    In the quest to remove all stack VLA usage from the kernel[1], this
    exposes a new general upper bound on crypto blocksize and alignmask
    (higher than for the existing cipher limits) for VLA removal,
    and introduces new checks.

    At present, the highest cra_alignmask in the kernel is 63. The highest
    cra_blocksize is 144 (SHA3_224_BLOCK_SIZE, 18 8-byte words). For the
    new blocksize limit, I went with 160 (20 8-byte words).

    [1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com

    Signed-off-by: Kees Cook <keescook@chromium.org>
    ---
    crypto/algapi.c | 7 ++++++-
    include/crypto/algapi.h | 4 +++-
    2 files changed, 9 insertions(+), 2 deletions(-)

    diff --git a/crypto/algapi.c b/crypto/algapi.c
    index c0755cf4f53f..496fc51bf215 100644
    --- a/crypto/algapi.c
    +++ b/crypto/algapi.c
    @@ -57,9 +57,14 @@ static int crypto_check_alg(struct crypto_alg *alg)
    if (alg->cra_alignmask & (alg->cra_alignmask + 1))
    return -EINVAL;

    - if (alg->cra_blocksize > PAGE_SIZE / 8)
    + /* General maximums for all algs. */
    + if (alg->cra_alignmask > MAX_ALGAPI_ALIGNMASK)
    return -EINVAL;

    + if (alg->cra_blocksize > MAX_ALGAPI_BLOCKSIZE)
    + return -EINVAL;
    +
    + /* Lower maximums for specific alg types. */
    if (!alg->cra_type && (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
    CRYPTO_ALG_TYPE_CIPHER) {
    if (alg->cra_alignmask > MAX_CIPHER_ALIGNMASK)
    diff --git a/include/crypto/algapi.h b/include/crypto/algapi.h
    index bd5e8ccf1687..21371ac8f355 100644
    --- a/include/crypto/algapi.h
    +++ b/include/crypto/algapi.h
    @@ -20,8 +20,10 @@
    /*
    * Maximum values for blocksize and alignmask, used to allocate
    * static buffers that are big enough for any combination of
    - * ciphers and architectures.
    + * algs and architectures. Ciphers have a lower maximum size.
    */
    +#define MAX_ALGAPI_BLOCKSIZE 160
    +#define MAX_ALGAPI_ALIGNMASK 63
    #define MAX_CIPHER_BLOCKSIZE 16
    #define MAX_CIPHER_ALIGNMASK 15

    --
    2.17.1
    \
     
     \ /
      Last update: 2018-08-03 00:52    [W:2.899 / U:0.424 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site