186d7f5d3SJohn Marino /* 286d7f5d3SJohn Marino * Random supply helper 386d7f5d3SJohn Marino * Copyright 2004, Clemens Fruhwirth <clemens@endorphin.org> 486d7f5d3SJohn Marino * 586d7f5d3SJohn Marino */ 686d7f5d3SJohn Marino 786d7f5d3SJohn Marino #include <sys/types.h> 886d7f5d3SJohn Marino #include <sys/stat.h> 986d7f5d3SJohn Marino #include <fcntl.h> 1086d7f5d3SJohn Marino #include <errno.h> 1186d7f5d3SJohn Marino #include <stdio.h> 1286d7f5d3SJohn Marino #include <unistd.h> 1386d7f5d3SJohn Marino 1486d7f5d3SJohn Marino static int randomfd = -1; 1586d7f5d3SJohn Marino openRandom()1686d7f5d3SJohn Marinoint openRandom() { 1786d7f5d3SJohn Marino if(randomfd == -1) 1886d7f5d3SJohn Marino randomfd = open("/dev/urandom", O_RDONLY); 1986d7f5d3SJohn Marino return randomfd; 2086d7f5d3SJohn Marino } 2186d7f5d3SJohn Marino 2286d7f5d3SJohn Marino /* This method leaks a file descriptor that can be obtained by calling 2386d7f5d3SJohn Marino closeRandom */ getRandom(char * buf,size_t len)2486d7f5d3SJohn Marinoint getRandom(char *buf, size_t len) 2586d7f5d3SJohn Marino { 2686d7f5d3SJohn Marino if(openRandom() == -1) { 2786d7f5d3SJohn Marino perror("getRandom:"); 2886d7f5d3SJohn Marino return -EINVAL; 2986d7f5d3SJohn Marino } 3086d7f5d3SJohn Marino while(len) { 3186d7f5d3SJohn Marino int r; 3286d7f5d3SJohn Marino r = read(randomfd,buf,len); 3386d7f5d3SJohn Marino if (-1 == r && errno != -EINTR) { 3486d7f5d3SJohn Marino perror("read: "); return -EINVAL; 3586d7f5d3SJohn Marino } 3686d7f5d3SJohn Marino len-= r; buf += r; 3786d7f5d3SJohn Marino } 3886d7f5d3SJohn Marino return 0; 3986d7f5d3SJohn Marino } 4086d7f5d3SJohn Marino closeRandom()4186d7f5d3SJohn Marinovoid closeRandom() { 4286d7f5d3SJohn Marino if(randomfd != -1) { 4386d7f5d3SJohn Marino close(randomfd); 4486d7f5d3SJohn Marino randomfd = -1; 4586d7f5d3SJohn Marino } 4686d7f5d3SJohn Marino } 47