qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Anthony Liguori <aliguori@us.ibm.com>
Cc: Amit Shah <amit.shah@redhat.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	qemu-devel@nongnu.org, Andreas Faerber <afaerber@suse.de>
Subject: Re: [Qemu-devel] [PATCH 4/8] rng-random: add an RNG backend that uses /dev/random (v2)
Date: Wed, 31 Oct 2012 08:36:14 +0100	[thread overview]
Message-ID: <5090D4EE.1070607@redhat.com> (raw)
In-Reply-To: <1351638178-15056-5-git-send-email-aliguori@us.ibm.com>

Il 31/10/2012 00:02, Anthony Liguori ha scritto:
> The filename can be overridden but it expects a non-blocking source of entropy.
> A typical invocation would be:
> 
> qemu -object rng-random,id=rng0 -device virtio-rng-pci,rng=rng0
> 
> This can also be used with /dev/urandom by using the command line:
> 
> qemu -object rng-random,filename=/dev/urandom,id=rng0 \
>      -device virtio-rng-pci,rng=rng0
> 
> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
> ---
> v1 -> v2
>  - merged header split patch into this one
> ---
>  backends/Makefile.objs    |   2 +-
>  backends/rng-random.c     | 161 ++++++++++++++++++++++++++++++++++++++++++++++
>  include/qemu/rng-random.h |  22 +++++++
>  3 files changed, 184 insertions(+), 1 deletion(-)
>  create mode 100644 backends/rng-random.c
>  create mode 100644 include/qemu/rng-random.h
> 
> diff --git a/backends/Makefile.objs b/backends/Makefile.objs
> index 06e08c7..23ca19b 100644
> --- a/backends/Makefile.objs
> +++ b/backends/Makefile.objs
> @@ -1 +1 @@
> -common-obj-y += rng.o
> +common-obj-y += rng.o rng-random.o
> diff --git a/backends/rng-random.c b/backends/rng-random.c
> new file mode 100644
> index 0000000..8325686
> --- /dev/null
> +++ b/backends/rng-random.c
> @@ -0,0 +1,161 @@
> +/*
> + * QEMU Random Number Generator Backend
> + *
> + * Copyright IBM, Corp. 2012
> + *
> + * Authors:
> + *  Anthony Liguori   <aliguori@us.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + */
> +
> +#include "qemu/rng-random.h"
> +#include "qemu/rng.h"
> +#include "qerror.h"
> +#include "main-loop.h"
> +
> +struct RndRandom
> +{
> +    RngBackend parent;
> +
> +    int fd;
> +    char *filename;
> +
> +    EntropyReceiveFunc *receive_func;
> +    void *opaque;
> +    size_t size;
> +};
> +
> +/**
> + * A simple and incomplete backend to request entropy from /dev/random.
> + *
> + * This backend exposes an additional "filename" property that can be used to
> + * set the filename to use to open the backend.
> + */
> +
> +static void entropy_available(void *opaque)
> +{
> +    RndRandom *s = RNG_RANDOM(opaque);
> +    uint8_t buffer[s->size];
> +    ssize_t len;
> +
> +    len = read(s->fd, buffer, s->size);
> +    g_assert(len != -1);
> +
> +    s->receive_func(s->opaque, buffer, s->size);

Should be len here, not s->size.

Otherwise looks good.

Paolo

> +    s->receive_func = NULL;
> +
> +    qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
> +}
> +
> +static void rng_random_request_entropy(RngBackend *b, size_t size,
> +                                        EntropyReceiveFunc *receive_entropy,
> +                                        void *opaque)
> +{
> +    RndRandom *s = RNG_RANDOM(b);
> +
> +    if (s->receive_func) {
> +        s->receive_func(s->opaque, NULL, 0);
> +    }
> +
> +    s->receive_func = receive_entropy;
> +    s->opaque = opaque;
> +    s->size = size;
> +
> +    qemu_set_fd_handler(s->fd, entropy_available, NULL, s);
> +}
> +
> +static void rng_random_opened(RngBackend *b, Error **errp)
> +{
> +    RndRandom *s = RNG_RANDOM(b);
> +
> +    if (s->filename == NULL) {
> +        error_set(errp, QERR_INVALID_PARAMETER_VALUE,
> +                  "filename", "a valid filename");
> +    } else {
> +        s->fd = open(s->filename, O_RDONLY | O_NONBLOCK);
> +
> +        if (s->fd == -1) {
> +            error_set(errp, QERR_OPEN_FILE_FAILED, s->filename);
> +        }
> +    }
> +}
> +
> +static char *rng_random_get_filename(Object *obj, Error **errp)
> +{
> +    RndRandom *s = RNG_RANDOM(obj);
> +
> +    if (s->filename) {
> +        return g_strdup(s->filename);
> +    }
> +
> +    return NULL;
> +}
> +
> +static void rng_random_set_filename(Object *obj, const char *filename,
> +                                 Error **errp)
> +{
> +    RngBackend *b = RNG_BACKEND(obj);
> +    RndRandom *s = RNG_RANDOM(obj);
> +
> +    if (b->opened) {
> +        error_set(errp, QERR_PERMISSION_DENIED);
> +        return;
> +    }
> +
> +    if (s->filename) {
> +        g_free(s->filename);
> +    }
> +
> +    s->filename = g_strdup(filename);
> +}
> +
> +static void rng_random_init(Object *obj)
> +{
> +    RndRandom *s = RNG_RANDOM(obj);
> +
> +    object_property_add_str(obj, "filename",
> +                            rng_random_get_filename,
> +                            rng_random_set_filename,
> +                            NULL);
> +
> +    s->filename = g_strdup("/dev/random");
> +}
> +
> +static void rng_random_finalize(Object *obj)
> +{
> +    RndRandom *s = RNG_RANDOM(obj);
> +
> +    qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
> +
> +    if (s->fd != -1) {
> +        close(s->fd);
> +    }
> +
> +    g_free(s->filename);
> +}
> +
> +static void rng_random_class_init(ObjectClass *klass, void *data)
> +{
> +    RngBackendClass *rbc = RNG_BACKEND_CLASS(klass);
> +
> +    rbc->request_entropy = rng_random_request_entropy;
> +    rbc->opened = rng_random_opened;
> +}
> +
> +static TypeInfo rng_random_info = {
> +    .name = TYPE_RNG_RANDOM,
> +    .parent = TYPE_RNG_BACKEND,
> +    .instance_size = sizeof(RndRandom),
> +    .class_init = rng_random_class_init,
> +    .instance_init = rng_random_init,
> +    .instance_finalize = rng_random_finalize,
> +};
> +
> +static void register_types(void)
> +{
> +    type_register_static(&rng_random_info);
> +}
> +
> +type_init(register_types);
> diff --git a/include/qemu/rng-random.h b/include/qemu/rng-random.h
> new file mode 100644
> index 0000000..6249290
> --- /dev/null
> +++ b/include/qemu/rng-random.h
> @@ -0,0 +1,22 @@
> +/*
> + * QEMU Random Number Generator Backend
> + *
> + * Copyright IBM, Corp. 2012
> + *
> + * Authors:
> + *  Anthony Liguori   <aliguori@us.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + */
> +#ifndef QEMU_RNG_RANDOM_H
> +#define QEMU_RNG_RANDOM_H
> +
> +#include "qemu/object.h"
> +
> +#define TYPE_RNG_RANDOM "rng-random"
> +#define RNG_RANDOM(obj) OBJECT_CHECK(RndRandom, (obj), TYPE_RNG_RANDOM)
> +
> +typedef struct RndRandom RndRandom;
> +
> +#endif
> -- 1.8.0
> 

  reply	other threads:[~2012-10-31  7:36 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-30 23:02 [Qemu-devel] [PATCH 0/8] add paravirtualization hwrng support (v2) Anthony Liguori
2012-10-30 23:02 ` [Qemu-devel] [PATCH 1/8] vl: add -object option to create QOM objects from the command line Anthony Liguori
2012-10-30 23:02 ` [Qemu-devel] [PATCH 2/8] object: add object_property_add_bool (v2) Anthony Liguori
2012-10-30 23:02 ` [Qemu-devel] [PATCH 3/8] rng: add RndBackend abstract object class Anthony Liguori
2012-10-30 23:02 ` [Qemu-devel] [PATCH 4/8] rng-random: add an RNG backend that uses /dev/random (v2) Anthony Liguori
2012-10-31  7:36   ` Paolo Bonzini [this message]
2012-10-30 23:02 ` [Qemu-devel] [PATCH 5/8] rng-egd: introduce EGD compliant RNG backend Anthony Liguori
2012-10-30 23:02 ` [Qemu-devel] [PATCH 6/8] virtio-rng: hardware random number generator device Anthony Liguori
2012-10-30 23:02 ` [Qemu-devel] [PATCH 7/8] virtio-rng: add rate limiting support Anthony Liguori
2012-10-30 23:02 ` [Qemu-devel] [PATCH 8/8] virtio-rng-pci: create a default backend if none exists Anthony Liguori
2012-10-31  1:24 ` [Qemu-devel] [PATCH 0/8] add paravirtualization hwrng support (v2) H. Peter Anvin
2012-10-31  2:12   ` Anthony Liguori
2012-10-31  7:12   ` Aurelien Jarno

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5090D4EE.1070607@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=afaerber@suse.de \
    --cc=aliguori@us.ibm.com \
    --cc=amit.shah@redhat.com \
    --cc=hpa@zytor.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).