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