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
This commit is contained in:
Sebastian Sumpf 2015-02-13 13:20:23 +01:00 committed by Christian Helmuth
parent a594ae703d
commit 422923cc95
8 changed files with 121 additions and 51 deletions

View File

@ -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 <base/stdint.h>
int rumpuser_getrandom_backend(void *buf, Genode::size_t buflen, int flags, Genode::size_t *retp);
#endif /* _INCLUDE__UTIL__RANDOM_H_ */

View File

@ -12,11 +12,6 @@ RMAKE = $(RUMP_TOOLS)/rumpmake
#
VERBOSE_LEVEL ?= 0
#
# Libraries
#
LIBS += jitterentropy
#
# Sources
#

View File

@ -19,14 +19,9 @@
#include <base/sleep.h>
#include <os/timed_semaphore.h>
#include <util/allocator_fap.h>
#include <util/random.h>
#include <util/string.h>
extern "C" {
namespace Jitter {
#include <jitterentropy.h>
}
}
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);
}

View File

@ -15,6 +15,15 @@
#include <util/string.h>
/*
* 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);

View File

@ -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 <base/printf.h>
#include <util/random.h>
extern "C" {
namespace Jitter {
#include <jitterentropy.h>
}
}
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;
}

View File

@ -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

View File

@ -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 <util/random.h>
int rumpuser_getrandom_backend(void *buf, Genode::size_t buflen, int flags, Genode::size_t *retp)
{
*retp = buflen;
return 0;
}

View File

@ -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