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");
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);