1 #include "os.h" 2 #include <mp.h> 3 #include <libsec.h> 4 #include "dat.h" 5 6 mpint* 7 mprand(int bits, void (*gen)(uchar*, int), mpint *b) 8 { 9 int n, m; 10 mpdigit mask; 11 uchar *p; 12 13 n = DIGITS(bits); 14 if(b == nil) 15 b = mpnew(bits); 16 else 17 mpbits(b, bits); 18 19 p = malloc(n*Dbytes); 20 if(p == nil) 21 return nil; 22 (*gen)(p, n*Dbytes); 23 betomp(p, n*Dbytes, b); 24 free(p); 25 26 // make sure we don't give too many bits 27 m = bits%Dbits; 28 n--; 29 if(m > 0){ 30 mask = 1; 31 mask <<= m; 32 mask--; 33 b->p[n] &= mask; 34 } 35 36 for(; n >= 0; n--) 37 if(b->p[n] != 0) 38 break; 39 b->top = n+1; 40 b->sign = 1; 41 return b; 42 } 43