Blob


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