int main(void) { int rc; H_UINT* buf; H_PARAMS havege_parameters; H_PTR havege_state = NULL; const int status_buf_size = 8192; char status_buf[status_buf_size]; int i, size; memset(&havege_parameters, 0, sizeof(H_PARAMS)); //havege_parameters.msg_out = print_msg; havege_state = havege_create(&havege_parameters); buf = havege_state->io_buf; size = havege_state->i_readSz /sizeof(H_UINT); rc = havege_state==NULL? H_NOHANDLE : havege_state->error; switch(rc) { case H_NOERR: fprintf(stderr, "havege_create: buffer size is %d\n", havege_state->i_readSz); break; case H_NOTESTSPEC: fprintf(stderr, "ERROR: havege_create: unrecognized test setup: %s", havege_parameters.testSpec); break; default: fprintf(stderr, "ERROR: havege_create has returned %d\n",rc); return 1; } rc = havege_run(havege_state); if ( rc ) { fprintf(stderr, "ERROR: havege_create has returned %d\n", havege_state->error); return 1; } if ( my_status_dump(havege_state, status_buf, status_buf_size) > 0 ) fprintf(stderr,"%s\n", status_buf); for (i=0;i<1024;i++) { rc = havege_rng(havege_state, buf, size); if ( rc != (int) size ) { fprintf(stderr, "ERROR: havege_rng has returned %d\n", havege_state->error); return 1; } rc = fwrite(buf, 1, size, stdout); if ( rc < size ) { fprintf(stderr, "ERROR: fwrite\n"); return 1; } } if ( my_status_dump(havege_state, status_buf, status_buf_size) > 0 ) fprintf(stderr,"%s\n", status_buf); havege_destroy(havege_state); return 0; }
/** * Run as a daemon writing to random device entropy pool */ static void run_daemon( /* RETURN: nothing */ H_PTR h) /* IN: app instance */ { int random_fd = -1; struct rand_pool_info *output; if (0 != params->run_level) { anchor_info(h); return; } if (params->foreground==0) daemonize(); else printf ("%s starting up\n", params->daemon); if (0 != havege_run(h)) error_exit("Couldn't initialize HAVEGE rng %d", h->error); if (0 != (params->verbose & H_DEBUG_INFO)) anchor_info(h); if (params->low_water>0) set_watermark(params->low_water); random_fd = open(params->random_device, O_RDWR); if (random_fd == -1) error_exit("Couldn't open random device: %s", strerror(errno)); output = (struct rand_pool_info *) h->io_buf; for(;;) { int current,nbytes,r; fd_set write_fd; FD_ZERO(&write_fd); FD_SET(random_fd, &write_fd); for(;;) { int rc = select(random_fd+1, NULL, &write_fd, NULL, NULL); if (rc >= 0) break; if (errno != EINTR) error_exit("Select error: %s", strerror(errno)); } if (ioctl(random_fd, RNDGETENTCNT, ¤t) == -1) error_exit("Couldn't query entropy-level from kernel"); /* get number of bytes needed to fill pool */ nbytes = (poolSize - current)/8; if(nbytes<1) continue; /* get that many random bytes */ r = (nbytes+sizeof(H_UINT)-1)/sizeof(H_UINT); if (havege_rng(h, (H_UINT *)output->buf, r)<1) error_exit("RNG failed! %d", h->error); output->buf_size = nbytes; /* entropy is 8 bits per byte */ output->entropy_count = nbytes * 8; if (ioctl(random_fd, RNDADDENTROPY, output) == -1) error_exit("RNDADDENTROPY failed!"); } }
/** * Run as application writing to a file */ static void run_app( /* RETURN: nothing */ H_PTR h, /* IN: app instance */ H_UINT bufct, /* IN: # buffers to fill */ H_UINT bufres) /* IN: # bytes extra */ { H_UINT *buffer; FILE *fout = NULL; H_UINT ct=0; int limits = bufct; if (0 != havege_run(h)) error_exit("Couldn't initialize HAVEGE rng %d", h->error); if (0 != (params->setup & USE_STDOUT)) { params->sample_out = "stdout"; fout = stdout; } else if (!(fout = fopen (params->sample_out, "wb"))) error_exit("Cannot open file <%s> for writing.\n", params->sample_out); limits = bufct!=0? 1 : bufres != 0; buffer = (H_UINT *)h->io_buf; #ifdef RAW_IN_ENABLE { char *format, *in="",*out,*sz,*src=""; if (params->run_level==DIAG_RUN_INJECT) in = "tics"; else if (params->run_level==DIAG_RUN_TEST) in = "data"; if (*in!=0) { src =(fd_in==stdin)? "stdin" : params->sample_in; format = "Inject %s from %s, writing %s bytes to %s\n"; } else format = "Writing %s%s%s bytes to %s\n"; if (limits) sz = ppSize((char *)buffer, (1.0 * bufct) * APP_BUFF_SIZE * sizeof(H_UINT) + bufres); else sz = "unlimited"; out = (fout==stdout)? "stdout" : params->sample_out; fprintf(stderr, format, in, src, sz, out); } #else if (limits) fprintf(stderr, "Writing %s output to %s\n", ppSize((char *)buffer, (1.0 * bufct) * APP_BUFF_SIZE * sizeof(H_UINT) + bufres), params->sample_out); else fprintf(stderr, "Writing unlimited bytes to stdout\n"); #endif while(!limits || ct++ < bufct) { if (havege_rng(h, buffer, APP_BUFF_SIZE)<1) error_exit("RNG failed %d!", h->error); if (fwrite (buffer, 1, APP_BUFF_SIZE * sizeof(H_UINT), fout) == 0) error_exit("Cannot write data in file: %s", strerror(errno)); } ct = (bufres + sizeof(H_UINT) - 1)/sizeof(H_UINT); if (ct) { if (havege_rng(h, buffer, ct)<1) error_exit("RNG failed %d!", h->error); if (fwrite (buffer, 1, bufres, fout) == 0) error_exit("Cannot write data in file: %s", strerror(errno)); } fclose(fout); if (0 != (params->verbose & H_DEBUG_INFO)) anchor_info(h); }