Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "os.h"
#include <mp.h>
#include <libsec.h>

//  generate a probable prime.  accuracy is the miller-rabin interations
void
genprime(mpint *p, int n, int accuracy)
{
        mpdigit x;

        // generate n random bits with high and low bits set
        mpbits(p, n);
        genrandom((uchar*)p->p, (n+7)/8);
        p->top = (n+Dbits-1)/Dbits;
        x = 1;
        x <<= ((n-1)%Dbits);
        p->p[p->top-1] &= (x-1);
        p->p[p->top-1] |= x;
        p->p[0] |= 1;
        mpnorm(p);

        // keep icrementing till it looks prime
        for(;;){
                if(probably_prime(p, accuracy))
                        break;
                mpadd(p, mptwo, p);
        }
}