Blob
1 #include "os.h"2 #include <mp.h>3 #include "dat.h"5 mpint*6 mprand(int bits, void (*gen)(uchar*, int), mpint *b)7 {8 int n, m;9 mpdigit mask;10 uchar *p;12 n = DIGITS(bits);13 if(b == nil)14 b = mpnew(bits);15 else16 mpbits(b, bits);18 p = malloc(n*Dbytes);19 if(p == nil)20 return nil;21 (*gen)(p, n*Dbytes);22 betomp(p, n*Dbytes, b);23 free(p);25 /* make sure we don't give too many bits */26 m = bits%Dbits;27 n--;28 if(m > 0){29 mask = 1;30 mask <<= m;31 mask--;32 b->p[n] &= mask;33 }35 for(; n >= 0; n--)36 if(b->p[n] != 0)37 break;38 b->top = n+1;39 b->sign = 1;40 return b;41 }