From: rasky Date: Tue, 28 Sep 2010 18:03:16 +0000 (+0000) Subject: SEC: add generic interface for entropy pools. X-Git-Tag: 2.6.0~66 X-Git-Url: https://codewiz.org/gitweb?a=commitdiff_plain;h=944e16fb3be5c147b6d400b9bfa65b7fa6d53ae3;p=bertos.git SEC: add generic interface for entropy pools. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@4335 38d2e660-2303-0410-9eaa-f027e97ec537 --- diff --git a/bertos/sec/entropy.h b/bertos/sec/entropy.h new file mode 100644 index 00000000..7d46e0d0 --- /dev/null +++ b/bertos/sec/entropy.h @@ -0,0 +1,98 @@ +/** + * \file + * + * + * \brief Entropy pool generic interface + * \author Giovanni Bajo + * + */ + +#ifndef SEC_ENTROPY_H +#define SEC_ENTROPY_H + +#include +#include + +/** + * Maximum number of different sources of entropy available in BeRTOS. + * + * Increasing this value will likely make entropy pools use more RAM for their operations, + * so it should be kept to the minimum necessary for a given project. + */ +#define CONFIG_ENTROPY_NUM_SOURCES 8 + +typedef struct EntropyPool_Context +{ + void (*add_entropy)(struct EntropyPool_Context *ctx, int source_idx, + const uint8_t *data, size_t len, + int entropy); + bool (*seeding_ready)(struct EntropyPool_Context *ctx); + void (*make_seed)(struct EntropyPool_Context *ctx, uint8_t *out, size_t len); + +} EntropyPool_Context; + + +/** + * Add some data samples containing entropy into the pool. + * the samples are in the buffer pointed by \a data for a total of \a len + * bytes. \a entropy is the number of bits of estimated entropy in the + * samples. \a source_idx is the index of the entropy source. + */ +INLINE void entropy_add(EntropyPool_Context *e, int source_idx, + const uint8_t *data, size_t len, + int entropy) +{ + ASSERT(e->add_entropy); + e->add_entropy(e, source_idx, data, len, entropy); +} + +/** + * Check if the generator is ready to produce a new seed. + */ +INLINE bool entropy_seeding_ready(EntropyPool_Context *ctx) +{ + ASSERT(ctx->seeding_ready); + return ctx->seeding_ready(ctx); +} + +/** + * Generate a new seed of the specified length. + * + * \note This should not be abused to generate a very long seed, since the pool + * cannot hold lots of entropy. + */ +INLINE void entropy_make_seed(EntropyPool_Context *ctx, uint8_t *out, size_t len) +{ + ASSERT(ctx->make_seed); + ctx->make_seed(ctx, out, len); +} + +#endif /* SEC_ENTROPY_H */