123456789101112131415161718192021222324252627282930313233343536373839404142 |
- #include "os.h"
- #include <mp.h>
- #include <libsec.h>
- #include "dat.h"
- mpint*
- mprand(int bits, void (*gen)(uchar*, int), mpint *b)
- {
- int n, m;
- mpdigit mask;
- uchar *p;
- n = DIGITS(bits);
- if(b == nil)
- b = mpnew(bits);
- else
- mpbits(b, bits);
- p = malloc(n*Dbytes);
- if(p == nil)
- return nil;
- (*gen)(p, n*Dbytes);
- betomp(p, n*Dbytes, b);
- free(p);
- // make sure we don't give too many bits
- m = bits%Dbits;
- n--;
- if(m > 0){
- mask = 1;
- mask <<= m;
- mask--;
- b->p[n] &= mask;
- }
- for(; n >= 0; n--)
- if(b->p[n] != 0)
- break;
- b->top = n+1;
- b->sign = 1;
- return b;
- }
|