xref: /plan9/sys/src/cmd/unix/drawterm/libmp/mprand.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1 #include "os.h"
2 #include <mp.h>
3 #include <libsec.h>
4 #include "dat.h"
5 
6 mpint*
mprand(int bits,void (* gen)(uchar *,int),mpint * b)7 mprand(int bits, void (*gen)(uchar*, int), mpint *b)
8 {
9 	int n, m;
10 	mpdigit mask;
11 	uchar *p;
12 
13 	n = DIGITS(bits);
14 	if(b == nil)
15 		b = mpnew(bits);
16 	else
17 		mpbits(b, bits);
18 
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);
25 
26 	// make sure we don't give too many bits
27 	m = bits%Dbits;
28 	n--;
29 	if(m > 0){
30 		mask = 1;
31 		mask <<= m;
32 		mask--;
33 		b->p[n] &= mask;
34 	}
35 
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 }
43