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