[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 1/1] lib/ukswrand: Add /dev/random and /dev/urandom
This patch adds the /dev/random and /dev/urandom devices. Since we do not currenly have any entropy generating function they share the same handlers. The registration of the devices is guarded by the config option CONFIG_DEV_RANDOM. The devfs patch series is required. Signed-off-by: Vlad-Andrei Badoiu <vlad_andrei.badoiu@xxxxxxxxxxxxxxx> --- lib/ukswrand/Config.uk | 5 ++++ lib/ukswrand/mwc.c | 65 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/lib/ukswrand/Config.uk b/lib/ukswrand/Config.uk index 44f6ee50..d694b61d 100644 --- a/lib/ukswrand/Config.uk +++ b/lib/ukswrand/Config.uk @@ -14,6 +14,11 @@ config LIBUKSWRAND_MWC Use multiply-with-carry algorithm endchoice + +config DEV_RANDOM + bool "/dev/random device" + select LIBDEVFS + config LIBUKSWRAND_INITIALSEED int "Initial random seed" default 23 diff --git a/lib/ukswrand/mwc.c b/lib/ukswrand/mwc.c index 199247d3..a276d657 100644 --- a/lib/ukswrand/mwc.c +++ b/lib/ukswrand/mwc.c @@ -37,6 +37,7 @@ #include <uk/print.h> #include <uk/assert.h> #include <uk/ctors.h> +#include <uk/config.h> /* https://stackoverflow.com/questions/9492581/c-random-number-generation-pure-c-code-no-libraries-or-functions */ #define PHI 0x9e3779b9 @@ -97,3 +98,67 @@ static void _uk_swrand_ctor(void) } UK_CTOR_FUNC(UK_SWRAND_CTOR_PRIO, _uk_swrand_ctor); + +#ifdef CONFIG_DEV_RANDOM + +#include <vfscore/device.h> +#include <vfscore/uio.h> +#include <stdlib.h> + +static const char dev_name[] = "urandom"; + +int dev_random_read(struct device *dev, struct uio *uio, int flags) +{ + char *buf; + size_t count; + + buf = uio->uio_iov->iov_base; + count = uio->uio_iov->iov_len; + + for (int i = 0; i < count; ++i) + buf[i] = uk_swrand_randr_r(&uk_swrand_def); + + uio->uio_resid = 0; + return 0; +} + +int dev_random_open(const char *c, int i, struct device **dev) +{ + return 0; +} + + +int dev_random_close(const char *c, int i, struct device **dev) +{ + return 0; +} + +static struct devops random_devops = { + .read = dev_random_read, + .open = dev_random_open, + .close = dev_random_close, +}; + +static struct driver drv = { + .devops = &random_devops, + .devsz = 0, + .name = dev_name +}; + +__constructor_prio(102) static void _uk_dev_swrand_ctor(void) +{ + struct device *dev; + + uk_pr_info("Add /dev/random and /dev/urandom\n"); + + /* register /dev/urandom */ + dev = device_create(&drv, dev_name, D_CHR); + if (dev == NULL) + uk_pr_info("Failed to register /dev/urandom\n"); + + /* register /dev/random */ + dev = device_create(&drv, dev_name + 1, D_CHR); + if (dev == NULL) + uk_pr_info("Failed to register /dev/random\n"); +} +#endif -- 2.20.1 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |