SEC: make sure PRNGs are seeded before generating data. This allows
authorrasky <rasky@38d2e660-2303-0410-9eaa-f027e97ec537>
Wed, 29 Sep 2010 15:37:11 +0000 (15:37 +0000)
committerrasky <rasky@38d2e660-2303-0410-9eaa-f027e97ec537>
Wed, 29 Sep 2010 15:37:11 +0000 (15:37 +0000)
init() function not to initialize seed-related memory without risking to
incur into unwanted behaviour.

git-svn-id: https://src.develer.com/svnoss/bertos/trunk@4355 38d2e660-2303-0410-9eaa-f027e97ec537

bertos/sec/prng.h
bertos/sec/prng/isaac.c
bertos/sec/prng/x917.c

index 7b39f5fac3c0659cf95fac44ce14ce38bdfe1db9..d0d21b454c29f590c30bbbc3825cd25e79adca77 100644 (file)
@@ -32,7 +32,7 @@
  *
  * \brief Generic interface for cryptographically-secure pseudo-RNG
  * \author Giovanni Bajo <rasky@develer.com>
- * 
+ *
  */
 
 #ifndef SEC_PRNG_H
 #include <cfg/debug.h>
 
 typedef struct PRNG
-{   
+{
     void (*reseed)(struct PRNG *ctx, const uint8_t *seed);
     void (*generate)(struct PRNG *ctx, uint8_t *data, size_t len);
-    size_t seed_len;   
+    uint8_t seed_len;
+       uint8_t seeded;
 } PRNG;
 
 /**
  * Feed a new seed into the PRNG.
- * 
+ *
  * \note: Being a cryptographically-secure PRNG, the seed will be
  * mixed to the current state of the generator, so it is NOT possible
  * to generate the same sequence simply by using the same seed. If you
@@ -60,6 +61,7 @@ INLINE void prng_reseed(PRNG *ctx, const uint8_t *seed)
 {
     ASSERT(ctx->reseed);
     ctx->reseed(ctx, seed);
+       ctx->seeded = 1;
 }
 
 /**
@@ -77,6 +79,7 @@ INLINE size_t prng_seed_len(PRNG *ctx)
 INLINE void prng_generate(PRNG *ctx, uint8_t *data, size_t len)
 {
     ASSERT(ctx->generate);
+       ASSERT(ctx->seeded);
     ctx->generate(ctx, data, len);
 }
 
index 72d4a320734e0ac159553d696fbc07b6b542dc94..4e031c0be5d9a36d234088b8a39cd460a8a721d1 100644 (file)
@@ -173,6 +173,7 @@ void isaac_init(IsaacContext *ctx)
        ctx->prng.reseed = isaac_reseed;
        ctx->prng.generate = isaac_generate;
        ctx->prng.seed_len = sizeof(ctx->randrsl) / 2;
+       ctx->prng.seeded = 0;
 
        ctx->randcnt = CONFIG_ISAAC_RANDSIZ*4;
        memset(ctx->randrsl, 0, sizeof(ctx->randrsl));
index 2ffba3aa8614334f131cd7f4dca1b8f3015183ca..63888c8f3b7ae99bb7f941fc294bc265c3b9b8e2 100644 (file)
@@ -123,4 +123,5 @@ void x917_init(X917Context *ctx)
        ctx->rng.reseed = x917_reseed;
        ctx->rng.generate = x917_generate;
        ctx->rng.seed_len = sizeof(ctx->key) + sizeof(ctx->state);
+       ctx->rng.seeded = 0;
 }