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