xref: /plan9/sys/src/cmd/unix/drawterm/libsec/genprime.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include "os.h"
2*8ccd4a63SDavid du Colombier #include <mp.h>
3*8ccd4a63SDavid du Colombier #include <libsec.h>
4*8ccd4a63SDavid du Colombier 
5*8ccd4a63SDavid du Colombier //  generate a probable prime.  accuracy is the miller-rabin interations
6*8ccd4a63SDavid du Colombier void
genprime(mpint * p,int n,int accuracy)7*8ccd4a63SDavid du Colombier genprime(mpint *p, int n, int accuracy)
8*8ccd4a63SDavid du Colombier {
9*8ccd4a63SDavid du Colombier 	mpdigit x;
10*8ccd4a63SDavid du Colombier 
11*8ccd4a63SDavid du Colombier 	// generate n random bits with high and low bits set
12*8ccd4a63SDavid du Colombier 	mpbits(p, n);
13*8ccd4a63SDavid du Colombier 	genrandom((uchar*)p->p, (n+7)/8);
14*8ccd4a63SDavid du Colombier 	p->top = (n+Dbits-1)/Dbits;
15*8ccd4a63SDavid du Colombier 	x = 1;
16*8ccd4a63SDavid du Colombier 	x <<= ((n-1)%Dbits);
17*8ccd4a63SDavid du Colombier 	p->p[p->top-1] &= (x-1);
18*8ccd4a63SDavid du Colombier 	p->p[p->top-1] |= x;
19*8ccd4a63SDavid du Colombier 	p->p[0] |= 1;
20*8ccd4a63SDavid du Colombier 
21*8ccd4a63SDavid du Colombier 	// keep icrementing till it looks prime
22*8ccd4a63SDavid du Colombier 	for(;;){
23*8ccd4a63SDavid du Colombier 		if(probably_prime(p, accuracy))
24*8ccd4a63SDavid du Colombier 			break;
25*8ccd4a63SDavid du Colombier 		mpadd(p, mptwo, p);
26*8ccd4a63SDavid du Colombier 	}
27*8ccd4a63SDavid du Colombier }
28