#include "os.h" | |
#include <mp.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; | |
} |