Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include "os.h"
2
#include <mp.h>
3
#include <libsec.h>
4
#include "dat.h"
5
 
6
mpint*
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
}