6 dh_new(DHstate *dh, mpint *p, mpint *q, mpint *g)
11 memset(dh, 0, sizeof(*dh));
12 if(mpcmp(g, mpone) <= 0)
20 dh->q = mpcopy(q != nil ? q : pm1);
21 dh->x = mpnew(mpsignif(dh->q));
24 mpnrand(dh->q, genrandom, dh->x);
25 mpexp(dh->g, dh->x, dh->p, dh->y);
26 if(mpcmp(dh->y, mpone) > 0 && mpcmp(dh->y, pm1) < 0)
35 dh_finish(DHstate *dh, mpint *y)
39 if(y == nil || dh->x == nil || dh->p == nil || dh->q == nil)
43 if(mpcmp(y, mpone) <= 0)
46 k = mpnew(mpsignif(dh->p));
49 mpsub(dh->p, mpone, k);
57 /* y**q % p == 1 if q < p-1 */
58 if(mpcmp(dh->q, k) < 0){
59 mpexp(y, dh->q, dh->p, k);
60 if(mpcmp(k, mpone) != 0)
64 mpexp(y, dh->x, dh->p, k);
72 memset(dh, 0, sizeof(*dh));