SEC: Add OMAC1/2 message authentication.
[bertos.git] / bertos / sec / prng / x917.c
index 2ffba3aa8614334f131cd7f4dca1b8f3015183ca..d2c84f71f1a4ae8d0a5e0b2aab0208e7852188cc 100644 (file)
@@ -103,17 +103,24 @@ static void x917_reseed(PRNG *ctx_, const uint8_t *seed)
        //     of the seed, and use the result as new seed.
        //   * Generate and throw away a block to update the state.
        X917Context *ctx = (X917Context *)ctx_;
+       const size_t klen = sizeof(ctx->key);
+       const size_t blen = sizeof(ctx->state);
 
-       size_t klen = sizeof(ctx->key);
-       size_t blen = sizeof(ctx->state);
-
-       uint8_t buf[klen];
-       x917_generate(ctx_, buf, klen);
+       if (!ctx->rng.seeded)
+       {
+               memcpy(ctx->key, seed, klen);
+               memcpy(ctx->state, seed+klen, blen);
+       }
+       else
+       {
+               uint8_t buf[klen];
+               x917_generate(ctx_, buf, klen);
 
-       xor_block(ctx->key, buf, seed, klen);
-       xor_block(ctx->state, ctx->state, seed+klen, blen);
+               xor_block(ctx->key, buf, seed, klen);
+               xor_block(ctx->state, ctx->state, seed+klen, blen);
 
-       PURGE(buf);
+               PURGE(buf);
+       }
 }
 
 /*********************************************************************/
@@ -123,4 +130,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;
 }