On Thu, Jul 16, 2020 at 05:40:28PM +0100, Elena Petrova wrote:
> Extending the userspace RNG interface:
> 1. adding ALG_SET_DRBG_ENTROPY setsockopt option for entropy input;
> 2. using sendmsg syscall for specifying the additional data.
>
> Signed-off-by: Elena Petrova <[email protected]>
Can you add more details to the commit message? E.g. why this is needed.
Also please use imperative tense, e.g. "Extend the userspace RNG interface".
> static int rng_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
> int flags)
> {
> @@ -65,6 +80,7 @@ static int rng_recvmsg(struct socket *sock, struct msghdr
> *msg, size_t len,
> int genlen = 0;
> u8 result[MAXSIZE];
>
> + lock_sock(sock->sk);
> if (len == 0)
> return 0;
This returns without unlocking the socket.
> if (len > MAXSIZE)
> @@ -82,16 +98,45 @@ static int rng_recvmsg(struct socket *sock, struct msghdr
> *msg, size_t len,
> * seeding as they automatically seed. The X9.31 DRNG will return
> * an error if it was not seeded properly.
> */
> - genlen = crypto_rng_get_bytes(ctx->drng, result, len);
> + genlen = crypto_rng_generate(ctx->drng, ctx->addtl, ctx->addtl_len,
> + result, len);
> if (genlen < 0)
> return genlen;
Likewise.
>
> err = memcpy_to_msg(msg, result, len);
> memzero_explicit(result, len);
> + rng_reset_addtl(ctx);
> + release_sock(sock->sk);
>
> return err ? err : len;
> }
>
> +static int rng_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
> +{
> + int err;
> + struct alg_sock *ask = alg_sk(sock->sk);
> + struct rng_ctx *ctx = ask->private;
> +
> + lock_sock(sock->sk);
> + if (len > MAXSIZE)
> + len = MAXSIZE;
> +
> + rng_reset_addtl(ctx);
> + ctx->addtl = kmalloc(len, GFP_KERNEL);
> + if (!ctx->addtl)
> + return -ENOMEM;
Likewise.
> +
> + err = memcpy_from_msg(ctx->addtl, msg, len);
> + if (err) {
> + rng_reset_addtl(ctx);
> + return err;
Likewise.