Blob


1 #include "os.h"
2 #include <mp.h>
3 #include <libsec.h>
5 DSAsig*
6 dsasign(DSApriv *priv, mpint *m)
7 {
8 DSApub *pub = &priv->pub;
9 DSAsig *sig;
10 mpint *qm1, *k, *kinv, *r, *s;
11 mpint *q = pub->q, *p = pub->p, *alpha = pub->alpha;
12 int qlen = mpsignif(q);
14 qm1 = mpnew(0);
15 kinv = mpnew(0);
16 r = mpnew(0);
17 s = mpnew(0);
18 k = mpnew(0);
19 mpsub(pub->q, mpone, qm1);
21 /* find a k that has an inverse mod q */
22 while(1){
23 mprand(qlen, genrandom, k);
24 if((mpcmp(mpone, k) > 0) || (mpcmp(k, pub->q) >= 0))
25 continue;
26 mpextendedgcd(k, q, r, kinv, s);
27 if(mpcmp(r, mpone) != 0)
28 sysfatal("dsasign: pub->q not prime");
29 break;
30 }
32 /* make kinv positive */
33 mpmod(kinv, pub->q, kinv);
35 /* r = ((alpha**k) mod p) mod q */
36 mpexp(alpha, k, p, r);
37 mpmod(r, q, r);
39 /* s = (kinv*(m + ar)) mod q */
40 mpmul(r, priv->secret, s);
41 mpadd(s, m, s);
42 mpmul(s, kinv, s);
43 mpmod(s, q, s);
45 sig = dsasigalloc();
46 sig->r = r;
47 sig->s = s;
48 mpfree(qm1);
49 mpfree(k);
50 mpfree(kinv);
51 return sig;
52 }