Subversion Repositories planix.SVN

Rev

Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 33
Line 1... Line 1...
1
#include "os.h"
1
#include "os.h"
2
#include <mp.h>
2
#include <mp.h>
3
#include <libsec.h>
-
 
4
#include "dat.h"
3
#include "dat.h"
5
 
4
 
6
mpint*
5
mpint*
7
mprand(int bits, void (*gen)(uchar*, int), mpint *b)
6
mprand(int bits, void (*gen)(uchar*, int), mpint *b)
8
{
7
{
9
	int n, m;
-
 
10
	mpdigit mask;
8
	mpdigit mask;
11
	uchar *p;
-
 
12
 
9
 
13
	n = DIGITS(bits);
-
 
14
	if(b == nil)
10
	if(b == nil){
15
		b = mpnew(bits);
11
		b = mpnew(bits);
-
 
12
		setmalloctag(b, getcallerpc(&bits));
16
	else
13
	}else
17
		mpbits(b, bits);
14
		mpbits(b, bits);
18
 
15
 
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;
16
	b->sign = 1;
-
 
17
	b->top = DIGITS(bits);
-
 
18
	(*gen)((uchar*)b->p, b->top*Dbytes);
-
 
19
 
-
 
20
	mask = ((mpdigit)1 << (bits%Dbits))-1;
-
 
21
	if(mask != 0)
-
 
22
		b->p[b->top-1] &= mask;
-
 
23
 
41
	return b;
24
	return mpnorm(b);
42
}
25
}