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 4/9] crypto: hash: Remove VLA usage
    Date
    In the quest to remove all stack VLA usage from the kernel[1], this
    removes the VLAs in SHASH_DESC_ON_STACK (via crypto_shash_descsize())
    by using the maximum allowable size (which is now more clearly captured
    in a macro), along with a few other cases. Similar limits are turned into
    macros as well.

    A review of existing sizes shows that SHA512_DIGEST_SIZE (64) is the
    largest digest size and that sizeof(struct sha3_state) (360) is the
    largest descriptor size. The corresponding maximums are reduced.

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

    Signed-off-by: Kees Cook <keescook@chromium.org>
    ---
    crypto/ahash.c | 4 ++--
    crypto/algif_hash.c | 2 +-
    crypto/shash.c | 6 +++---
    include/crypto/hash.h | 6 +++++-
    4 files changed, 11 insertions(+), 7 deletions(-)

    diff --git a/crypto/ahash.c b/crypto/ahash.c
    index a64c143165b1..78aaf2158c43 100644
    --- a/crypto/ahash.c
    +++ b/crypto/ahash.c
    @@ -550,8 +550,8 @@ static int ahash_prepare_alg(struct ahash_alg *alg)
    {
    struct crypto_alg *base = &alg->halg.base;

    - if (alg->halg.digestsize > PAGE_SIZE / 8 ||
    - alg->halg.statesize > PAGE_SIZE / 8 ||
    + if (alg->halg.digestsize > HASH_MAX_DIGESTSIZE ||
    + alg->halg.statesize > HASH_MAX_STATESIZE ||
    alg->halg.statesize == 0)
    return -EINVAL;

    diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c
    index bfcf595fd8f9..d0cde541beb6 100644
    --- a/crypto/algif_hash.c
    +++ b/crypto/algif_hash.c
    @@ -239,7 +239,7 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags,
    struct alg_sock *ask = alg_sk(sk);
    struct hash_ctx *ctx = ask->private;
    struct ahash_request *req = &ctx->req;
    - char state[crypto_ahash_statesize(crypto_ahash_reqtfm(req)) ? : 1];
    + char state[HASH_MAX_STATESIZE];
    struct sock *sk2;
    struct alg_sock *ask2;
    struct hash_ctx *ctx2;
    diff --git a/crypto/shash.c b/crypto/shash.c
    index 5d732c6bb4b2..86d76b5c626c 100644
    --- a/crypto/shash.c
    +++ b/crypto/shash.c
    @@ -458,9 +458,9 @@ static int shash_prepare_alg(struct shash_alg *alg)
    {
    struct crypto_alg *base = &alg->base;

    - if (alg->digestsize > PAGE_SIZE / 8 ||
    - alg->descsize > PAGE_SIZE / 8 ||
    - alg->statesize > PAGE_SIZE / 8)
    + if (alg->digestsize > HASH_MAX_DIGESTSIZE ||
    + alg->descsize > HASH_MAX_DESCSIZE ||
    + alg->statesize > HASH_MAX_STATESIZE)
    return -EINVAL;

    base->cra_type = &crypto_shash_type;
    diff --git a/include/crypto/hash.h b/include/crypto/hash.h
    index 76e432cab75d..21587011ab0f 100644
    --- a/include/crypto/hash.h
    +++ b/include/crypto/hash.h
    @@ -151,9 +151,13 @@ struct shash_desc {
    void *__ctx[] CRYPTO_MINALIGN_ATTR;
    };

    +#define HASH_MAX_DIGESTSIZE 64
    +#define HASH_MAX_DESCSIZE 360
    +#define HASH_MAX_STATESIZE 512
    +
    #define SHASH_DESC_ON_STACK(shash, ctx) \
    char __##shash##_desc[sizeof(struct shash_desc) + \
    - crypto_shash_descsize(ctx)] CRYPTO_MINALIGN_ATTR; \
    + HASH_MAX_DESCSIZE] CRYPTO_MINALIGN_ATTR; \
    struct shash_desc *shash = (struct shash_desc *)__##shash##_desc

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