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 Colombiergetseed(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 Colombierrandombytes(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