[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 4/8] rng-random: add an RNG backend that uses /d
From: |
Paolo Bonzini |
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 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121016 Thunderbird/16.0.1 |
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 <address@hidden>
> ---
> 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 <address@hidden>
> + *
> + * 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 <address@hidden>
> + *
> + * 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
>
- [Qemu-devel] [PATCH 0/8] add paravirtualization hwrng support (v2), Anthony Liguori, 2012/10/30
- [Qemu-devel] [PATCH 5/8] rng-egd: introduce EGD compliant RNG backend, Anthony Liguori, 2012/10/30
- [Qemu-devel] [PATCH 4/8] rng-random: add an RNG backend that uses /dev/random (v2), Anthony Liguori, 2012/10/30
- Re: [Qemu-devel] [PATCH 4/8] rng-random: add an RNG backend that uses /dev/random (v2),
Paolo Bonzini <=
- [Qemu-devel] [PATCH 3/8] rng: add RndBackend abstract object class, Anthony Liguori, 2012/10/30
- [Qemu-devel] [PATCH 7/8] virtio-rng: add rate limiting support, Anthony Liguori, 2012/10/30
- [Qemu-devel] [PATCH 6/8] virtio-rng: hardware random number generator device, Anthony Liguori, 2012/10/30
- [Qemu-devel] [PATCH 1/8] vl: add -object option to create QOM objects from the command line, Anthony Liguori, 2012/10/30
- [Qemu-devel] [PATCH 8/8] virtio-rng-pci: create a default backend if none exists, Anthony Liguori, 2012/10/30
- [Qemu-devel] [PATCH 2/8] object: add object_property_add_bool (v2), Anthony Liguori, 2012/10/30
- Re: [Qemu-devel] [PATCH 0/8] add paravirtualization hwrng support (v2), H. Peter Anvin, 2012/10/30