Blame


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"
4 b3f61791 2004-03-21 devnull
5 b3f61791 2004-03-21 devnull mpint*
6 b3f61791 2004-03-21 devnull mprand(int bits, void (*gen)(uchar*, int), mpint *b)
7 b3f61791 2004-03-21 devnull {
8 b3f61791 2004-03-21 devnull int n, m;
9 b3f61791 2004-03-21 devnull mpdigit mask;
10 b3f61791 2004-03-21 devnull uchar *p;
11 b3f61791 2004-03-21 devnull
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);
15 b3f61791 2004-03-21 devnull else
16 b3f61791 2004-03-21 devnull mpbits(b, bits);
17 b3f61791 2004-03-21 devnull
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);
23 b3f61791 2004-03-21 devnull free(p);
24 b3f61791 2004-03-21 devnull
25 cbeb0b26 2006-04-01 devnull /* make sure we don't give too many bits */
26 b3f61791 2004-03-21 devnull m = bits%Dbits;
27 b3f61791 2004-03-21 devnull n--;
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;
31 b3f61791 2004-03-21 devnull mask--;
32 b3f61791 2004-03-21 devnull b->p[n] &= mask;
33 b3f61791 2004-03-21 devnull }
34 b3f61791 2004-03-21 devnull
35 b3f61791 2004-03-21 devnull for(; n >= 0; n--)
36 b3f61791 2004-03-21 devnull if(b->p[n] != 0)
37 b3f61791 2004-03-21 devnull break;
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;
41 b3f61791 2004-03-21 devnull }