Blob


1 #include "os.h"
2 #include <mp.h>
3 #include "dat.h"
5 mpint*
6 mprand(int bits, void (*gen)(uchar*, int), mpint *b)
7 {
8 int n, m;
9 mpdigit mask;
10 uchar *p;
12 n = DIGITS(bits);
13 if(b == nil)
14 b = mpnew(bits);
15 else
16 mpbits(b, bits);
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);
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 }
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 }