xref: /dflybsd-src/contrib/cryptsetup/luks/random.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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 Marino int 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 Marino int 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 Marino void closeRandom() {
4286d7f5d3SJohn Marino     if(randomfd != -1) {
4386d7f5d3SJohn Marino 	close(randomfd);
4486d7f5d3SJohn Marino 	randomfd = -1;
4586d7f5d3SJohn Marino     }
4686d7f5d3SJohn Marino }
47