Commit 66531c75 authored by Michael Niedermayer's avatar Michael Niedermayer

random_seed: rewrite generic code.

The new code is faster and reuses the previous state in case of
multiple calls. For testing the iterations are reduced and several
entropy sources are disabled.
Its based on SHA-1
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 37f1a7d5
...@@ -22,8 +22,15 @@ ...@@ -22,8 +22,15 @@
#include <fcntl.h> #include <fcntl.h>
#include <math.h> #include <math.h>
#include <time.h> #include <time.h>
#include <string.h>
#include "timer.h" #include "timer.h"
#include "random_seed.h" #include "random_seed.h"
#include "sha.h"
#include "intreadwrite.h"
#ifndef TEST
#define TEST 0
#endif
static int read_random(uint32_t *dst, const char *file) static int read_random(uint32_t *dst, const char *file)
{ {
...@@ -40,34 +47,44 @@ static int read_random(uint32_t *dst, const char *file) ...@@ -40,34 +47,44 @@ static int read_random(uint32_t *dst, const char *file)
static uint32_t get_generic_seed(void) static uint32_t get_generic_seed(void)
{ {
uint8_t tmp[av_sha_size];
struct AVSHA *sha = (void*)tmp;
clock_t last_t = 0; clock_t last_t = 0;
int bits = 0; static uint64_t i = 0;
uint64_t random = 0; static uint32_t buffer[512] = {0};
unsigned i; unsigned char digest[32];
float s = 0.000000000001; uint64_t last_i = i;
for (i = 0; bits < 64; i++) { if(TEST){
memset(buffer, 0, sizeof(buffer));
last_i = i = 0;
}else{
#ifdef AV_READ_TIME
buffer[13] ^= AV_READ_TIME();
buffer[41] ^= AV_READ_TIME()>>32;
#endif
}
for (;;) {
clock_t t = clock(); clock_t t = clock();
if (last_t && fabs(t - last_t) > s || t == (clock_t) -1) {
if (i < 10000 && s < (1 << 24)) { if(last_t == t){
s += s; buffer[i&511]++;
i = t = 0; }else{
} else { buffer[++i&511]+= (t-last_t) % 3294638521U;
random = 2 * random + (i & 1); if(last_i && i-last_i > 4 || i-last_i > 64 || TEST && i-last_i > 8)
bits++; break;
}
} }
last_t = t; last_t = t;
} }
#ifdef AV_READ_TIME
random ^= AV_READ_TIME();
#else
random ^= clock();
#endif
random += random >> 32; if(TEST)
buffer[0] = buffer[1] = 0;
return random; av_sha_init(sha, 160);
av_sha_update(sha, (uint8_t*)buffer, sizeof(buffer));
av_sha_final(sha, digest);
return AV_RB32(digest) + AV_RB32(digest+32);
} }
uint32_t av_get_random_seed(void) uint32_t av_get_random_seed(void)
...@@ -81,7 +98,7 @@ uint32_t av_get_random_seed(void) ...@@ -81,7 +98,7 @@ uint32_t av_get_random_seed(void)
return get_generic_seed(); return get_generic_seed();
} }
#ifdef TEST #if TEST
#undef printf #undef printf
#define N 256 #define N 256
#include <stdio.h> #include <stdio.h>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment