1*37da2899SCharles.Forsythimplement Random; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsythinclude "sys.m"; 4*37da2899SCharles.Forsythinclude "draw.m"; 5*37da2899SCharles.Forsythinclude "keyring.m"; 6*37da2899SCharles.Forsythinclude "security.m"; 7*37da2899SCharles.Forsyth 8*37da2899SCharles.Forsythsys: Sys; 9*37da2899SCharles.Forsyth 10*37da2899SCharles.Forsythrandfd(which: int): ref sys->FD 11*37da2899SCharles.Forsyth{ 12*37da2899SCharles.Forsyth file: string; 13*37da2899SCharles.Forsyth 14*37da2899SCharles.Forsyth sys = load Sys Sys->PATH; 15*37da2899SCharles.Forsyth case(which){ 16*37da2899SCharles.Forsyth ReallyRandom => 17*37da2899SCharles.Forsyth file = "/dev/random"; 18*37da2899SCharles.Forsyth NotQuiteRandom => 19*37da2899SCharles.Forsyth file = "/dev/notquiterandom"; 20*37da2899SCharles.Forsyth } 21*37da2899SCharles.Forsyth fd := sys->open(file, sys->OREAD); 22*37da2899SCharles.Forsyth if(fd == nil){ 23*37da2899SCharles.Forsyth sys->print("can't open /dev/random\n"); 24*37da2899SCharles.Forsyth return nil; 25*37da2899SCharles.Forsyth } 26*37da2899SCharles.Forsyth return fd; 27*37da2899SCharles.Forsyth} 28*37da2899SCharles.Forsyth 29*37da2899SCharles.Forsythrandomint(which: int): int 30*37da2899SCharles.Forsyth{ 31*37da2899SCharles.Forsyth fd := randfd(which); 32*37da2899SCharles.Forsyth if(fd == nil) 33*37da2899SCharles.Forsyth return 0; 34*37da2899SCharles.Forsyth buf := array[4] of byte; 35*37da2899SCharles.Forsyth sys->read(fd, buf, 4); 36*37da2899SCharles.Forsyth rand := 0; 37*37da2899SCharles.Forsyth for(i := 0; i < 4; i++) 38*37da2899SCharles.Forsyth rand = (rand<<8) | int buf[i]; 39*37da2899SCharles.Forsyth return rand; 40*37da2899SCharles.Forsyth} 41*37da2899SCharles.Forsyth 42*37da2899SCharles.Forsythrandombuf(which, n: int): array of byte 43*37da2899SCharles.Forsyth{ 44*37da2899SCharles.Forsyth buf := array[n] of byte; 45*37da2899SCharles.Forsyth fd := randfd(which); 46*37da2899SCharles.Forsyth if(fd == nil) 47*37da2899SCharles.Forsyth return buf; 48*37da2899SCharles.Forsyth sys->read(fd, buf, n); 49*37da2899SCharles.Forsyth return buf; 50*37da2899SCharles.Forsyth} 51