From 422923cc95b97157196622e1409358e231514f3b Mon Sep 17 00:00:00 2001 From: Sebastian Sumpf Date: Fri, 13 Feb 2015 13:20:23 +0100 Subject: [PATCH] rump: Add 'get_random_backend' function A rump server may now implement its own random number generator, the default impelementation will not generate random number. Issue #1409 --- repos/dde_rump/include/util/random.h | 21 +++++++ repos/dde_rump/lib/mk/rump_base.inc | 5 -- repos/dde_rump/src/lib/rump/hypercall.cc | 45 +------------- repos/dde_rump/src/lib/rump/misc.cc | 9 +++ repos/dde_rump/src/server/rump_cgd/random.cc | 64 ++++++++++++++++++++ repos/dde_rump/src/server/rump_cgd/target.mk | 5 +- repos/dde_rump/src/server/rump_fs/random.cc | 21 +++++++ repos/dde_rump/src/server/rump_fs/target.mk | 2 +- 8 files changed, 121 insertions(+), 51 deletions(-) create mode 100644 repos/dde_rump/include/util/random.h create mode 100644 repos/dde_rump/src/server/rump_cgd/random.cc create mode 100644 repos/dde_rump/src/server/rump_fs/random.cc diff --git a/repos/dde_rump/include/util/random.h b/repos/dde_rump/include/util/random.h new file mode 100644 index 0000000000..5e4672ec00 --- /dev/null +++ b/repos/dde_rump/include/util/random.h @@ -0,0 +1,21 @@ +/** + * \brief Overwritable backend-random methods + * \author Sebastian Sumpf + * \date 2015-02-13 + */ + +/* + * Copyright (C) 2015 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#ifndef _INCLUDE__UTIL__RANDOM_H_ +#define _INCLUDE__UTIL__RANDOM_H_ + +#include + +int rumpuser_getrandom_backend(void *buf, Genode::size_t buflen, int flags, Genode::size_t *retp); + +#endif /* _INCLUDE__UTIL__RANDOM_H_ */ diff --git a/repos/dde_rump/lib/mk/rump_base.inc b/repos/dde_rump/lib/mk/rump_base.inc index b56602d40b..45bd847794 100644 --- a/repos/dde_rump/lib/mk/rump_base.inc +++ b/repos/dde_rump/lib/mk/rump_base.inc @@ -12,11 +12,6 @@ RMAKE = $(RUMP_TOOLS)/rumpmake # VERBOSE_LEVEL ?= 0 -# -# Libraries -# -LIBS += jitterentropy - # # Sources # diff --git a/repos/dde_rump/src/lib/rump/hypercall.cc b/repos/dde_rump/src/lib/rump/hypercall.cc index ddb2d0c82b..0891ee6f67 100644 --- a/repos/dde_rump/src/lib/rump/hypercall.cc +++ b/repos/dde_rump/src/lib/rump/hypercall.cc @@ -19,14 +19,9 @@ #include #include #include +#include #include -extern "C" { - namespace Jitter { - #include - } -} - extern "C" void wait_for_continue(); enum { SUPPORTED_RUMP_VERSION = 17 }; @@ -36,38 +31,6 @@ static bool verbose = false; struct rumpuser_hyperup _rump_upcalls; -/*********************************** - ** Jitter entropy for randomness ** - ***********************************/ - -struct Entropy -{ - struct Jitter::rand_data *ec_stir; - - Entropy() - { - Jitter::jent_entropy_init(); - ec_stir = Jitter::jent_entropy_collector_alloc(0, 0); - } - - static Entropy *e() - { - static Entropy _e; - return &_e; - } - - size_t read(char *buf, size_t len) - { - int err; - if ((err = Jitter::jent_read_entropy(ec_stir, buf, len) < 0)) { - PERR("Failed to read entropy: %d", err); - return 0; - } - - return len; - } -}; - /******************** ** Initialization ** ********************/ @@ -90,9 +53,6 @@ int rumpuser_init(int version, const struct rumpuser_hyperup *hyp) */ Genode::Timeout_thread::alarm_timer(); - /* initialize jitter entropy */ - Entropy::e(); - return 0; } @@ -336,8 +296,7 @@ int rumpuser_clock_sleep(int enum_rumpclock, int64_t sec, long nsec) int rumpuser_getrandom(void *buf, size_t buflen, int flags, size_t *retp) { - *retp = Entropy::e()->read((char *)buf, buflen); - return 0; + return rumpuser_getrandom_backend(buf, buflen, flags, retp); } diff --git a/repos/dde_rump/src/lib/rump/misc.cc b/repos/dde_rump/src/lib/rump/misc.cc index 5a918383ab..ecf6ccade6 100644 --- a/repos/dde_rump/src/lib/rump/misc.cc +++ b/repos/dde_rump/src/lib/rump/misc.cc @@ -15,6 +15,15 @@ #include +/* + * On some platforms (namely ARM) we end-up pulling in string.h prototypes + */ +extern "C" void *memcpy(void *d, void *s, Genode::size_t n) +{ + return Genode::memcpy(d, s, n); +} + + extern "C" void *memset(void *s, int c, Genode::size_t n) { return Genode::memset(s, c, n); diff --git a/repos/dde_rump/src/server/rump_cgd/random.cc b/repos/dde_rump/src/server/rump_cgd/random.cc new file mode 100644 index 0000000000..6d0be95a24 --- /dev/null +++ b/repos/dde_rump/src/server/rump_cgd/random.cc @@ -0,0 +1,64 @@ +/** + * \brief Add random support for CGD + * \author Sebastian Sumpf + * \date 2015-02-13 + */ + +/* + * Copyright (C) 2015 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#include +#include + +extern "C" { + namespace Jitter { + #include + } +} + +typedef Genode::size_t size_t; + + +/*********************************** + ** Jitter entropy for randomness ** + ***********************************/ + +struct Entropy +{ + struct Jitter::rand_data *ec_stir; + + Entropy() + { + Jitter::jent_entropy_init(); + ec_stir = Jitter::jent_entropy_collector_alloc(0, 0); + } + + static Entropy *e() + { + static Entropy _e; + return &_e; + } + + size_t read(char *buf, size_t len) + { + int err; + if ((err = Jitter::jent_read_entropy(ec_stir, buf, len) < 0)) { + PERR("Failed to read entropy: %d", err); + return 0; + } + + return len; + } +}; + + +int rumpuser_getrandom_backend(void *buf, size_t buflen, int flags, size_t *retp) +{ + *retp = Entropy::e()->read((char *)buf, buflen); + *retp = buflen; + return 0; +} diff --git a/repos/dde_rump/src/server/rump_cgd/target.mk b/repos/dde_rump/src/server/rump_cgd/target.mk index 390129156b..86e47bbf43 100644 --- a/repos/dde_rump/src/server/rump_cgd/target.mk +++ b/repos/dde_rump/src/server/rump_cgd/target.mk @@ -1,3 +1,4 @@ TARGET = rump_cgd -SRC_CC = cgd.cc main.cc -LIBS = rump rump_cgd server startup + +SRC_CC = cgd.cc main.cc random.cc +LIBS = rump rump_cgd server startup jitterentropy diff --git a/repos/dde_rump/src/server/rump_fs/random.cc b/repos/dde_rump/src/server/rump_fs/random.cc new file mode 100644 index 0000000000..142de81d2d --- /dev/null +++ b/repos/dde_rump/src/server/rump_fs/random.cc @@ -0,0 +1,21 @@ +/** + * \brief Dummy random support + * \author Sebastian Sumpf + * \date 2015-02-16 + */ + +/* + * Copyright (C) 2015 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#include + + +int rumpuser_getrandom_backend(void *buf, Genode::size_t buflen, int flags, Genode::size_t *retp) +{ + *retp = buflen; + return 0; +} diff --git a/repos/dde_rump/src/server/rump_fs/target.mk b/repos/dde_rump/src/server/rump_fs/target.mk index b251639a3f..56fd8f4fda 100644 --- a/repos/dde_rump/src/server/rump_fs/target.mk +++ b/repos/dde_rump/src/server/rump_fs/target.mk @@ -1,5 +1,5 @@ TARGET = rump_fs -SRC_CC = main.cc file_system.cc +SRC_CC = main.cc file_system.cc random.cc LIBS = rump rump_fs server startup