int main(int argc, char *argv[]) { uint32_t bit; uint32_t i; uint32_t nb_bits_samples = NB_BITS_SAMPLES; uint32_t nb_bytes_samples = nb_bits_samples / 8; uint32_t nb_bytes = 0; uint8_t samples[nb_bytes_samples]; uint8_t test = 0; signal(SIGINT, signal_handler); if(argc > 1 && strcmp(argv[1], "-d") == 0) daemonize(); if(argc > 1 && strcmp(argv[1], "-t") == 0) test = 1; create_fifo_and_wait("w", "Waiting for server to start...", "Server started : could start Random numbers generation."); qrand_setup(); while (keep_going) { for (i = 0; i < nb_bits_samples; i++) { bit = qrand(); //When we want to test the rng, we don't want it to be unbiaise if(test == 1) { nb_bytes = build_byte(bit, (uint8_t*)&samples); } else { nb_bytes = exclusive_or(bit, (uint8_t*)&samples); } if(nb_bytes >= nb_bytes_samples) { send_numbers((uint8_t*)&samples, nb_bytes_samples); } usleep(SLEEP_INTERVAL); } } qrand_close(); return 0; }
/*Another algorithm to reduice biais, used by Giorgio Vazzana but reduice the rate of number generation. */ uint32_t von_neumann(uint32_t bit, uint8_t *samples) { static uint32_t previous = 0; static uint32_t flip_flop = 0; uint32_t nb_bytes = 0; flip_flop = !flip_flop; if(flip_flop) { if(previous != bit) { nb_bytes = build_byte(previous, samples); } } previous = bit; return nb_bytes; }
/*Exclusive XOR used by the PEAR to reduice bias*/ uint32_t exclusive_or(uint32_t bit, uint8_t *samples) { static uint32_t flip_flop = 0; flip_flop = !flip_flop; return build_byte(flip_flop ^ bit, samples); }