1 #include "os.h"
2 #include <mp.h>
3 #include <libsec.h>
4 
5 int
dsaverify(DSApub * pub,DSAsig * sig,mpint * m)6 dsaverify(DSApub *pub, DSAsig *sig, mpint *m)
7 {
8 	int rv = -1;
9 	mpint *u1, *u2, *v, *sinv;
10 
11 	if(mpcmp(sig->r, mpone) < 0 || mpcmp(sig->r, pub->q) >= 0)
12 		return rv;
13 	if(mpcmp(sig->s, mpone) < 0 || mpcmp(sig->s, pub->q) >= 0)
14 		return rv;
15 	u1 = mpnew(0);
16 	u2 = mpnew(0);
17 	v = mpnew(0);
18 	sinv = mpnew(0);
19 
20 	/* find (s**-1) mod q, make sure it exists */
21 	mpextendedgcd(sig->s, pub->q, u1, sinv, v);
22 	if(mpcmp(u1, mpone) != 0)
23 		goto out;
24 
25 	/* u1 = (sinv * m) mod q, u2 = (r * sinv) mod q */
26 	mpmul(sinv, m, u1);
27 	mpmod(u1, pub->q, u1);
28 	mpmul(sig->r, sinv, u2);
29 	mpmod(u2, pub->q, u2);
30 
31 	/* v = (((alpha**u1)*(key**u2)) mod p) mod q */
32 	mpexp(pub->alpha, u1, pub->p, sinv);
33 	mpexp(pub->key, u2, pub->p, v);
34 	mpmul(sinv, v, v);
35 	mpmod(v, pub->p, v);
36 	mpmod(v, pub->q, v);
37 
38 	if(mpcmp(v, sig->r) == 0)
39 		rv = 0;
40 out:
41 	mpfree(v);
42 	mpfree(u1);
43 	mpfree(u2);
44 	mpfree(sinv);
45 	return rv;
46 }
47