On Fri, Jul 20, 2018 at 07:42:01PM +0200, Stephan Müller wrote:
>
> @@ -1747,10 +1733,18 @@ static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
>                             u8 *outbuf, u32 outlen)
>  {
>       struct scatterlist *sg_in = &drbg->sg_in, *sg_out = &drbg->sg_out;
> +     u32 scratchpad_use = min_t(u32, outlen, DRBG_OUTSCRATCHLEN);
>       int ret;
>  
> -     sg_set_buf(sg_in, inbuf, inlen);
> -     sg_set_buf(sg_out, drbg->outscratchpad, DRBG_OUTSCRATCHLEN);
> +     if (inbuf) {
> +             /* Use caller-provided input buffer */
> +             sg_set_buf(sg_in, inbuf, inlen);
> +     } else {
> +             /* Use scratchpad for in-place operation */
> +             inlen = scratchpad_use;
> +             memset(drbg->outscratchpad, 0, scratchpad_use);
> +             sg_set_buf(sg_in, drbg->outscratchpad, scratchpad_use);
> +     }

What guarantees that inbuf isn't on the stack?

I think rather than doing this we need to fix the existing code
to copy inbuf onto the scratch pad and then do in-place operation
on that.

Cheers,
-- 
Email: Herbert Xu <herb...@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

Reply via email to