4 * This file is part of BeRTOS.
6 * Bertos is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 * As a special exception, you may use this file as part of a free software
21 * library without restriction. Specifically, if other files instantiate
22 * templates or use macros or inline functions from this file, or you compile
23 * this file and link it with other files to produce an executable, this
24 * file does not by itself cause the resulting executable to be covered by
25 * the GNU General Public License. This exception does not however
26 * invalidate any other reasons why the executable file might be covered by
27 * the GNU General Public License.
29 * Copyright 2010 Develer S.r.l. (http://www.develer.com/)
33 * \brief Entropy pool generic interface
34 * \author Giovanni Bajo <rasky@develer.com>
41 #include <cfg/compiler.h>
42 #include <cfg/debug.h>
45 * Maximum number of different sources of entropy available in BeRTOS.
47 * Increasing this value will likely make entropy pools use more RAM for their operations,
48 * so it should be kept to the minimum necessary for a given project.
50 #define CONFIG_ENTROPY_NUM_SOURCES 8
52 typedef struct EntropyPool
54 void (*add_entropy)(struct EntropyPool *ctx, int source_idx,
55 const uint8_t *data, size_t len,
57 bool (*seeding_ready)(struct EntropyPool *ctx);
58 void (*make_seed)(struct EntropyPool *ctx, uint8_t *out, size_t len);
64 * Add some data samples containing entropy into the pool.
65 * the samples are in the buffer pointed by \a data for a total of \a len
66 * bytes. \a entropy is the number of bits of estimated entropy in the
67 * samples. \a source_idx is the index of the entropy source.
69 INLINE void entropy_add(EntropyPool *e, int source_idx,
70 const uint8_t *data, size_t len,
73 ASSERT(e->add_entropy);
74 e->add_entropy(e, source_idx, data, len, entropy);
78 * Check if the generator is ready to produce a new seed.
80 INLINE bool entropy_seeding_ready(EntropyPool *ctx)
82 ASSERT(ctx->seeding_ready);
83 return ctx->seeding_ready(ctx);
87 * Generate a new seed of the specified length.
89 * \note This should not be abused to generate a very long seed, since the pool
90 * cannot hold lots of entropy.
92 INLINE void entropy_make_seed(EntropyPool *ctx, uint8_t *out, size_t len)
94 ASSERT(ctx->make_seed);
95 ctx->make_seed(ctx, out, len);
98 #endif /* SEC_ENTROPY_H */