Skip to content

Commit

Permalink
dh key: get rid of stack allocated array
Browse files Browse the repository at this point in the history
We're interested in getting rid of all of the stack allocated arrays in the
kernel: https://lkml.org/lkml/2018/3/7/621

This particular vla is used as a temporary output buffer in case there is
too much hash output for the destination buffer. Instead, let's just
allocate a buffer that's big enough initially, but only copy back to
userspace the amount that was originally asked for.

v2: allocate enough in the original output buffer vs creating a temporary
    output buffer

Signed-off-by: Tycho Andersen <[email protected]>
Reviewed-by: Kees Cook <[email protected]>
CC: David Howells <[email protected]>
CC: James Morris <[email protected]>
CC: "Serge E. Hallyn" <[email protected]>
CC: Eric Biggers <[email protected]>
Signed-off-by: James Morris <[email protected]>
  • Loading branch information
tych0 authored and James Morris committed May 11, 2018
1 parent a964f39 commit 383203e
Showing 1 changed file with 10 additions and 19 deletions.
29 changes: 10 additions & 19 deletions security/keys/dh.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,24 +183,13 @@ static int kdf_ctr(struct kdf_sdesc *sdesc, const u8 *src, unsigned int slen,
goto err;
}

if (dlen < h) {
u8 tmpbuffer[h];

err = crypto_shash_final(desc, tmpbuffer);
if (err)
goto err;
memcpy(dst, tmpbuffer, dlen);
memzero_explicit(tmpbuffer, h);
return 0;
} else {
err = crypto_shash_final(desc, dst);
if (err)
goto err;
err = crypto_shash_final(desc, dst);
if (err)
goto err;

dlen -= h;
dst += h;
counter = cpu_to_be32(be32_to_cpu(counter) + 1);
}
dlen -= h;
dst += h;
counter = cpu_to_be32(be32_to_cpu(counter) + 1);
}

return 0;
Expand All @@ -216,14 +205,16 @@ static int keyctl_dh_compute_kdf(struct kdf_sdesc *sdesc,
{
uint8_t *outbuf = NULL;
int ret;
size_t outbuf_len = round_up(buflen,
crypto_shash_digestsize(sdesc->shash.tfm));

outbuf = kmalloc(buflen, GFP_KERNEL);
outbuf = kmalloc(outbuf_len, GFP_KERNEL);
if (!outbuf) {
ret = -ENOMEM;
goto err;
}

ret = kdf_ctr(sdesc, kbuf, kbuflen, outbuf, buflen, lzero);
ret = kdf_ctr(sdesc, kbuf, kbuflen, outbuf, outbuf_len, lzero);
if (ret)
goto err;

Expand Down

0 comments on commit 383203e

Please sign in to comment.