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 <libsec.h>
4 b3f61791 2004-03-21 devnull #include "dat.h"
7 b3f61791 2004-03-21 devnull mprand(int bits, void (*gen)(uchar*, int), mpint *b)
10 b3f61791 2004-03-21 devnull mpdigit mask;
11 b3f61791 2004-03-21 devnull uchar *p;
13 b3f61791 2004-03-21 devnull n = DIGITS(bits);
14 b3f61791 2004-03-21 devnull if(b == nil)
15 b3f61791 2004-03-21 devnull b = mpnew(bits);
17 b3f61791 2004-03-21 devnull mpbits(b, bits);
19 b3f61791 2004-03-21 devnull p = malloc(n*Dbytes);
20 b3f61791 2004-03-21 devnull if(p == nil)
21 b3f61791 2004-03-21 devnull return nil;
22 b3f61791 2004-03-21 devnull (*gen)(p, n*Dbytes);
23 b3f61791 2004-03-21 devnull betomp(p, n*Dbytes, b);
26 b3f61791 2004-03-21 devnull // make sure we don't give too many bits
27 b3f61791 2004-03-21 devnull m = bits%Dbits;
29 b3f61791 2004-03-21 devnull if(m > 0){
30 b3f61791 2004-03-21 devnull mask = 1;
31 b3f61791 2004-03-21 devnull mask <<= m;
33 b3f61791 2004-03-21 devnull b->p[n] &= mask;
36 b3f61791 2004-03-21 devnull for(; n >= 0; n--)
37 b3f61791 2004-03-21 devnull if(b->p[n] != 0)
39 b3f61791 2004-03-21 devnull b->top = n+1;
40 b3f61791 2004-03-21 devnull b->sign = 1;
41 b3f61791 2004-03-21 devnull return b;