From 1a170e9cafa3e9f92f21b9f3b1cdf8de3932f7df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Tue, 19 Aug 2014 17:35:42 +0200 Subject: [PATCH] libports: add vfs_jitterentropy library This file system library uses the the jitterentropy library to provide a rudimentary '/dev/random' device. Fixes #1239. --- repos/libports/lib/mk/vfs_jitterentropy.mk | 9 ++ .../libports/src/lib/vfs/jitterentropy/vfs.cc | 36 +++++++ .../lib/vfs/jitterentropy/vfs_jitterentropy.h | 101 ++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 repos/libports/lib/mk/vfs_jitterentropy.mk create mode 100644 repos/libports/src/lib/vfs/jitterentropy/vfs.cc create mode 100644 repos/libports/src/lib/vfs/jitterentropy/vfs_jitterentropy.h diff --git a/repos/libports/lib/mk/vfs_jitterentropy.mk b/repos/libports/lib/mk/vfs_jitterentropy.mk new file mode 100644 index 000000000..d28de418e --- /dev/null +++ b/repos/libports/lib/mk/vfs_jitterentropy.mk @@ -0,0 +1,9 @@ +SRC_CC = vfs.cc + +INC_DIR += $(REP_DIR)/src/lib/vfs/jitterentropy + +LIBS += libc jitterentropy + +vpath %.cc $(REP_DIR)/src/lib/vfs/jitterentropy + +SHARED_LIB = yes diff --git a/repos/libports/src/lib/vfs/jitterentropy/vfs.cc b/repos/libports/src/lib/vfs/jitterentropy/vfs.cc new file mode 100644 index 000000000..456009e2f --- /dev/null +++ b/repos/libports/src/lib/vfs/jitterentropy/vfs.cc @@ -0,0 +1,36 @@ +/* + * \brief Jitterentropy based random file system + * \author Josef Soentgen + * \date 2014-08-19 + */ + +/* + * Copyright (C) 2014 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. + */ + +/* Genode includes */ +#include + +/* local includes */ +#include + + +struct Jitterentropy_factory : Libc::File_system_factory +{ + Jitterentropy_factory() : File_system_factory("jitterentropy") { } + + Vfs::File_system *create(Genode::Xml_node node) + { + return new (Genode::env()->heap()) Jitterentropy_file_system(node); + } +}; + + +extern "C" Libc::File_system_factory *Libc_file_system_factory(void) +{ + static Jitterentropy_factory factory; + return &factory; +} diff --git a/repos/libports/src/lib/vfs/jitterentropy/vfs_jitterentropy.h b/repos/libports/src/lib/vfs/jitterentropy/vfs_jitterentropy.h new file mode 100644 index 000000000..6d9f23445 --- /dev/null +++ b/repos/libports/src/lib/vfs/jitterentropy/vfs_jitterentropy.h @@ -0,0 +1,101 @@ +/* + * \brief Jitterentropy based random file system + * \author Josef Soentgen + * \date 2014-08-19 + */ + +/* + * Copyright (C) 2014 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 _JITTERENTROPY_FILE_SYSTEM_H_ +#define _JITTERENTROPY_FILE_SYSTEM_H_ + +/* Genode includes */ +#include +#include + +/* jitterentropy includes */ +extern "C" { +#include +} + +class Jitterentropy_file_system : public Vfs::Single_file_system +{ + private: + + struct rand_data *_ec_stir; + bool _initialized; + + bool _init_jitterentropy() + { + int err = jent_entropy_init(); + if (err) { + PERR("jitterentropy library could not be initialized!"); + return false; + } + + /* use the default behaviour as specified in jitterentropy(3) */ + _ec_stir = jent_entropy_collector_alloc(0, 0); + if (!_ec_stir) { + PERR("jitterentropy could not allocate entropy collector!"); + return false; + } + + return true; + } + + public: + + Jitterentropy_file_system(Genode::Xml_node config) + : + Single_file_system(NODE_TYPE_CHAR_DEVICE, name(), config), + _ec_stir(0), + _initialized(_init_jitterentropy()) + { } + + ~Jitterentropy_file_system() + { + if (_initialized) + jent_entropy_collector_free(_ec_stir); + } + + static char const *name() { return "jitterentropy"; } + + + /******************************** + ** File I/O service interface ** + ********************************/ + + Write_result write(Vfs::Vfs_handle *, char const *, Genode::size_t count, + Genode::size_t &count_out) override + { + return WRITE_ERR_IO; + } + + Read_result read(Vfs::Vfs_handle *vfs_handle, char *dst, Genode::size_t count, + Genode::size_t &out_count) override + { + if (!_initialized) + return READ_ERR_IO; + + enum { MAX_BUF_LEN = 256 }; + char buf[MAX_BUF_LEN]; + + size_t len = count > MAX_BUF_LEN ? MAX_BUF_LEN : count; + + if (jent_read_entropy(_ec_stir, buf, len) < 0) + return READ_ERR_IO; + + Genode::memcpy(dst, buf, len); + + out_count = len; + + return READ_OK; + } +}; + +#endif /* _JITTERENTROPY_FILE_SYSTEM_H_ */