1 b3f61791 2004-03-21 devnull #include "os.h"
2 b3f61791 2004-03-21 devnull #include <mp.h>
3 b3f61791 2004-03-21 devnull #include "dat.h"
6 b3f61791 2004-03-21 devnull mprand(int bits, void (*gen)(uchar*, int), mpint *b)
9 b3f61791 2004-03-21 devnull mpdigit mask;
10 b3f61791 2004-03-21 devnull uchar *p;
12 b3f61791 2004-03-21 devnull n = DIGITS(bits);
13 b3f61791 2004-03-21 devnull if(b == nil)
14 b3f61791 2004-03-21 devnull b = mpnew(bits);
16 b3f61791 2004-03-21 devnull mpbits(b, bits);
18 b3f61791 2004-03-21 devnull p = malloc(n*Dbytes);
19 b3f61791 2004-03-21 devnull if(p == nil)
20 b3f61791 2004-03-21 devnull return nil;
21 b3f61791 2004-03-21 devnull (*gen)(p, n*Dbytes);
22 b3f61791 2004-03-21 devnull betomp(p, n*Dbytes, b);
25 cbeb0b26 2006-04-01 devnull /* make sure we don't give too many bits */
26 b3f61791 2004-03-21 devnull m = bits%Dbits;
28 b3f61791 2004-03-21 devnull if(m > 0){
29 b3f61791 2004-03-21 devnull mask = 1;
30 b3f61791 2004-03-21 devnull mask <<= m;
32 b3f61791 2004-03-21 devnull b->p[n] &= mask;
35 b3f61791 2004-03-21 devnull for(; n >= 0; n--)
36 b3f61791 2004-03-21 devnull if(b->p[n] != 0)
38 b3f61791 2004-03-21 devnull b->top = n+1;
39 b3f61791 2004-03-21 devnull b->sign = 1;
40 b3f61791 2004-03-21 devnull return b;