libports: add vfs_jitterentropy library

This file system library uses the the jitterentropy library to provide
a rudimentary '/dev/random' device.

Fixes #1239.
This commit is contained in:
Josef Söntgen 2014-08-19 17:35:42 +02:00 committed by Norman Feske
parent 2f46930824
commit 1a170e9caf
3 changed files with 146 additions and 0 deletions

View File

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

View File

@ -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 <libc-plugin/vfs.h>
/* local includes */
#include <vfs_jitterentropy.h>
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;
}

View File

@ -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 <util/xml_node.h>
#include <vfs/single_file_system.h>
/* jitterentropy includes */
extern "C" {
#include <jitterentropy.h>
}
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_ */