From patchwork Thu May 9 13:22:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 1097502 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 450DZF4yznz9s7h for ; Thu, 9 May 2019 23:23:49 +1000 (AEST) Received: from localhost ([127.0.0.1]:54502 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hOj1X-0001Uv-40 for incoming@patchwork.ozlabs.org; Thu, 09 May 2019 09:23:47 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47726) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hOj0j-0001TM-Fr for qemu-devel@nongnu.org; Thu, 09 May 2019 09:22:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hOj0i-0001dj-DH for qemu-devel@nongnu.org; Thu, 09 May 2019 09:22:57 -0400 Received: from mx1.redhat.com ([209.132.183.28]:34044) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hOj0i-0001YQ-66 for qemu-devel@nongnu.org; Thu, 09 May 2019 09:22:56 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0ED06309B167; Thu, 9 May 2019 13:22:43 +0000 (UTC) Received: from thinkpad.redhat.com (unknown [10.40.205.9]) by smtp.corp.redhat.com (Postfix) with ESMTP id D6BE8600C7; Thu, 9 May 2019 13:22:35 +0000 (UTC) From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 9 May 2019 15:22:34 +0200 Message-Id: <20190509132234.22103-1-lvivier@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.49]); Thu, 09 May 2019 13:22:43 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC] rng-random: allow to use getrandom() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier , Amit Shah , Kashyap Chamarthy , Richard Henderson , Markus Armbruster , "Richard W . M . Jones" , Gerd Hoffmann Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add a parameter to select the rng-random backend mode, from a file or from qemu_guest_getrandom(): -object rng-random,id=rng0,mode=file or -object rng-random,id=rng0,mode=getrandom by default mode is file This patch applies on top of "[PATCH v4 00/24] Add qemu_getrandom and ARMv8.5-RNG etc" Based-on: <20190506173353.32206-1-richard.henderson@linaro.org> Signed-off-by: Laurent Vivier --- backends/rng-random.c | 76 ++++++++++++++++++++++++++++++++++++------- qapi/ui.json | 11 +++++++ 2 files changed, 76 insertions(+), 11 deletions(-) diff --git a/backends/rng-random.c b/backends/rng-random.c index e2a49b0571d7..e95c71545ef9 100644 --- a/backends/rng-random.c +++ b/backends/rng-random.c @@ -14,13 +14,16 @@ #include "sysemu/rng-random.h" #include "sysemu/rng.h" #include "qapi/error.h" +#include "qapi/qapi-types-ui.h" #include "qapi/qmp/qerror.h" #include "qemu/main-loop.h" +#include "qemu/guest-random.h" struct RngRandom { RngBackend parent; + RngRandomMode mode; int fd; char *filename; }; @@ -59,10 +62,27 @@ static void rng_random_request_entropy(RngBackend *b, RngRequest *req) { RngRandom *s = RNG_RANDOM(b); - if (QSIMPLEQ_EMPTY(&s->parent.requests)) { - /* If there are no pending requests yet, we need to - * install our fd handler. */ - qemu_set_fd_handler(s->fd, entropy_available, NULL, s); + switch (s->mode) { + case RNG_RANDOM_MODE_FILE: + if (QSIMPLEQ_EMPTY(&s->parent.requests)) { + /* If there are no pending requests yet, we need to + * install our fd handler. */ + qemu_set_fd_handler(s->fd, entropy_available, NULL, s); + } + break; + case RNG_RANDOM_MODE_GETRANDOM: + while (!QSIMPLEQ_EMPTY(&s->parent.requests)) { + RngRequest *req = QSIMPLEQ_FIRST(&s->parent.requests); + + qemu_guest_getrandom_nofail(req->data, req->size); + + req->receive_entropy(req->opaque, req->data, req->size); + + rng_backend_finalize_request(&s->parent, req); + } + break; + default: + break; } } @@ -70,17 +90,40 @@ static void rng_random_opened(RngBackend *b, Error **errp) { RngRandom *s = RNG_RANDOM(b); - if (s->filename == NULL) { - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, - "filename", "a valid filename"); - } else { - s->fd = qemu_open(s->filename, O_RDONLY | O_NONBLOCK); - if (s->fd == -1) { - error_setg_file_open(errp, errno, s->filename); + switch (s->mode) { + case RNG_RANDOM_MODE_FILE: + if (s->filename == NULL) { + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, + "filename", "a valid filename"); + } else { + s->fd = qemu_open(s->filename, O_RDONLY | O_NONBLOCK); + if (s->fd == -1) { + error_setg_file_open(errp, errno, s->filename); + } } + break; + case RNG_RANDOM_MODE_GETRANDOM: + break; + default: + break; } } +static int rng_random_get_mode(Object *obj, Error **errp) +{ + RngRandom *s = RNG_RANDOM(obj); + + return s->mode; +} + +static void rng_random_set_mode(Object *obj, int value, + Error **errp) +{ + RngRandom *s = RNG_RANDOM(obj); + + s->mode = value; +} + static char *rng_random_get_filename(Object *obj, Error **errp) { RngRandom *s = RNG_RANDOM(obj); @@ -94,6 +137,11 @@ static void rng_random_set_filename(Object *obj, const char *filename, RngBackend *b = RNG_BACKEND(obj); RngRandom *s = RNG_RANDOM(obj); + if (s->mode != RNG_RANDOM_MODE_FILE) { + error_setg(errp, QERR_INVALID_PARAMETER, "filename"); + return; + } + if (b->opened) { error_setg(errp, QERR_PERMISSION_DENIED); return; @@ -107,11 +155,17 @@ static void rng_random_init(Object *obj) { RngRandom *s = RNG_RANDOM(obj); + object_property_add_enum(obj, "mode", "RngRandomMode", + &RngRandomMode_lookup, + rng_random_get_mode, + rng_random_set_mode, + NULL); object_property_add_str(obj, "filename", rng_random_get_filename, rng_random_set_filename, NULL); + s->mode = RNG_RANDOM_MODE_FILE; s->filename = g_strdup("/dev/random"); s->fd = -1; } diff --git a/qapi/ui.json b/qapi/ui.json index 59e412139adc..25b33d79e9af 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -1170,3 +1170,14 @@ ## { 'command': 'query-display-options', 'returns': 'DisplayOptions' } + +## +# @RngRandomMode: +# +# Value to select random number generation mode in rng-random backend +# +# Since: 4.1 +# +## +{ 'enum': 'RngRandomMode', + 'data': [ 'file', 'getrandom' ] }