X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fsec%2Fprng%2Fx917.c;h=d2c84f71f1a4ae8d0a5e0b2aab0208e7852188cc;hb=ae3571e0d7273f8642468c6a0958c29c05dc7b2a;hp=2ffba3aa8614334f131cd7f4dca1b8f3015183ca;hpb=075bcf453371e1b3f7b6ca72b4080eefbe1be3f7;p=bertos.git diff --git a/bertos/sec/prng/x917.c b/bertos/sec/prng/x917.c index 2ffba3aa..d2c84f71 100644 --- a/bertos/sec/prng/x917.c +++ b/bertos/sec/prng/x917.c @@ -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; }