6 dsasign(DSApriv *priv, mpint *m)
8 DSApub *pub = &priv->pub;
10 mpint *qm1, *k, *kinv, *r, *s;
11 mpint *q = pub->q, *p = pub->p, *alpha = pub->alpha;
12 int qlen = mpsignif(q);
19 mpsub(pub->q, mpone, qm1);
21 /* find a k that has an inverse mod q */
23 mprand(qlen, genrandom, k);
24 if((mpcmp(mpone, k) > 0) || (mpcmp(k, pub->q) >= 0))
26 mpextendedgcd(k, q, r, kinv, s);
27 if(mpcmp(r, mpone) != 0)
28 sysfatal("dsasign: pub->q not prime");
32 /* make kinv positive */
33 mpmod(kinv, pub->q, kinv);
35 /* r = ((alpha**k) mod p) mod q */
36 mpexp(alpha, k, p, r);
39 /* s = (kinv*(m + ar)) mod q */
40 mpmul(r, priv->secret, s);