void random_init (void) { static int random_initialized = 0; if (random_initialized) return; int fd = open("/dev/urandom", O_RDONLY); if (fd == -1) { fd = open("/dev/random", O_RDONLY); } if (fd >= 0) { uint64_t seed[8]; if (full_read(fd, seed, sizeof(seed)) < (int64_t)sizeof(seed)) goto nasty_fallback; srand(seed[0]); twister_init_by_array64(seed, sizeof(seed)/sizeof(seed[0])); } else { uint64_t seed; nasty_fallback: debug(D_NOTICE, "warning: falling back to low-quality entropy"); seed = (uint64_t)getpid() ^ (uint64_t)time(NULL); seed |= (((uint64_t)(uintptr_t)&seed) << 32); /* using ASLR */ srand(seed); twister_init_genrand64(seed); } close(fd); random_initialized = 1; return; }
void random_init (void) { int fd = open("/dev/urandom", O_RDONLY); if (fd == -1) { fd = open("/dev/random", O_RDONLY); } if (fd >= 0) { uint64_t seed[8]; if (full_read(fd, seed, sizeof(seed)) < (int64_t)sizeof(seed)) goto nasty_fallback; srand(seed[0]); twister_init_by_array64(seed, sizeof(seed)/sizeof(seed[0])); } else { uint64_t seed; nasty_fallback: seed = (uint64_t)getpid() ^ (uint64_t)time(NULL); seed |= (((uint64_t)(uintptr_t)&seed) << 32); /* using ASLR */ srand(seed); twister_init_genrand64(seed); } close(fd); return; }