Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

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

// Gordon's algorithm for generating a strong prime
//      Menezes et al () Handbook, p.150
void
genstrongprime(mpint *p, int n, int accuracy)
{
        mpint *s, *t, *r, *i;

        if(n < 64)
                n = 64;

        s = mpnew(n/2);
        genprime(s, (n/2)-16, accuracy);
        t = mpnew(n/2);
        genprime(t, n-mpsignif(s)-32, accuracy);

        // first r = 2it + 1 that's prime
        i = mpnew(16);
        r = mpnew(0);
        itomp(0x8000, i);
        mpleft(t, 1, t);        // 2t
        mpmul(i, t, r);         // 2it
        mpadd(r, mpone, r);     // 2it + 1
        for(;;){
                if(probably_prime(r, 18))
                        break;
                mpadd(r, t, r); // r += 2t
        }

        // p0 = 2(s**(r-2) mod r)s - 1
        itomp(2, p);
        mpsub(r, p, p);
        mpexp(s, p, r, p);
        mpmul(s, p, p);
        mpleft(p, 1, p);
        mpsub(p, mpone, p);

        // first p = p0 + 2irs that's prime
        itomp(0x8000, i);
        mpleft(r, 1, r);        // 2r
        mpmul(r, s, r);         // 2rs
        mpmul(r, i, i);         // 2irs
        mpadd(p, i, p);         // p0 + 2irs
        for(;;){
                if(probably_prime(p, accuracy))
                        break;
                mpadd(p, r, p); // p += 2rs
        }

        mpfree(i);
        mpfree(s);
        mpfree(r);
        mpfree(t);
}