xref: /plan9/sys/src/cmd/unix/u9fs/random.c (revision 39b91b2bea1bdc6d8e213fc7f7a2911875f95d28)
19a747e4fSDavid du Colombier #include <plan9.h>
29a747e4fSDavid du Colombier #include <fcall.h>
39a747e4fSDavid du Colombier #include <u9fs.h>
49a747e4fSDavid du Colombier #include <stdlib.h>
59a747e4fSDavid du Colombier #include <sys/time.h>
69a747e4fSDavid du Colombier #include <fcntl.h>
79a747e4fSDavid du Colombier 
89a747e4fSDavid du Colombier static long
getseed(void)99a747e4fSDavid du Colombier getseed(void)
109a747e4fSDavid du Colombier {
119a747e4fSDavid du Colombier 	struct timeval tv;
129a747e4fSDavid du Colombier 	long seed;
139a747e4fSDavid du Colombier 	int fd, len;
149a747e4fSDavid du Colombier 
159a747e4fSDavid du Colombier 	len = 0;
169a747e4fSDavid du Colombier 	fd = open("/dev/urandom", O_RDONLY);
179a747e4fSDavid du Colombier 	if(fd > 0){
189a747e4fSDavid du Colombier 		len = readn(fd, &seed, sizeof(seed));
199a747e4fSDavid du Colombier 		close(fd);
209a747e4fSDavid du Colombier 	}
219a747e4fSDavid du Colombier 	if(len != sizeof(seed)){
229a747e4fSDavid du Colombier 		gettimeofday(&tv, nil);
239a747e4fSDavid du Colombier 		seed = tv.tv_sec ^ tv.tv_usec ^ (getpid()<<8);
249a747e4fSDavid du Colombier 	}
259a747e4fSDavid du Colombier 	return seed;
269a747e4fSDavid du Colombier }
279a747e4fSDavid du Colombier 
289a747e4fSDavid du Colombier static int seeded;
299a747e4fSDavid du Colombier 
309a747e4fSDavid du Colombier void
randombytes(uchar * r,uint nr)319a747e4fSDavid du Colombier randombytes(uchar *r, uint nr)
329a747e4fSDavid du Colombier {
339a747e4fSDavid du Colombier 	int i;
349a747e4fSDavid du Colombier 	ulong l;
359a747e4fSDavid du Colombier 
369a747e4fSDavid du Colombier 	if(!seeded){
379a747e4fSDavid du Colombier 		seeded=1;
38*39b91b2bSDavid du Colombier 		srandom(getseed());
399a747e4fSDavid du Colombier 	}
409a747e4fSDavid du Colombier 	for(i=0; i+4<=nr; i+=4,r+=4){
41*39b91b2bSDavid du Colombier 		l = (ulong)random();
429a747e4fSDavid du Colombier 		r[0] = l;
439a747e4fSDavid du Colombier 		r[1] = l>>8;
449a747e4fSDavid du Colombier 		r[2] = l>>16;
459a747e4fSDavid du Colombier 		r[3] = l>>24;
469a747e4fSDavid du Colombier 	}
479a747e4fSDavid du Colombier 	if(i<nr){
48*39b91b2bSDavid du Colombier 		l = (ulong)random();
499a747e4fSDavid du Colombier 		switch(nr-i){
509a747e4fSDavid du Colombier 		case 3:
519a747e4fSDavid du Colombier 			r[2] = l>>16;
529a747e4fSDavid du Colombier 		case 2:
539a747e4fSDavid du Colombier 			r[1] = l>>8;
549a747e4fSDavid du Colombier 		case 1:
559a747e4fSDavid du Colombier 			r[0] = l;
569a747e4fSDavid du Colombier 		}
579a747e4fSDavid du Colombier 	}
589a747e4fSDavid du Colombier }
59