xref: /plan9/sys/src/libsec/port/dsaverify.c (revision 39734e7ed1eb944f5e7b41936007d0d38b560d7f)
13ff48bf5SDavid du Colombier #include "os.h"
23ff48bf5SDavid du Colombier #include <mp.h>
33ff48bf5SDavid du Colombier #include <libsec.h>
43ff48bf5SDavid du Colombier 
53ff48bf5SDavid du Colombier int
dsaverify(DSApub * pub,DSAsig * sig,mpint * m)63ff48bf5SDavid du Colombier dsaverify(DSApub *pub, DSAsig *sig, mpint *m)
73ff48bf5SDavid du Colombier {
83ff48bf5SDavid du Colombier 	int rv = -1;
93ff48bf5SDavid du Colombier 	mpint *u1, *u2, *v, *sinv;
103ff48bf5SDavid du Colombier 
11*39734e7eSDavid du Colombier 	if(mpcmp(sig->r, mpone) < 0 || mpcmp(sig->r, pub->q) >= 0)
123ff48bf5SDavid du Colombier 		return rv;
13*39734e7eSDavid du Colombier 	if(mpcmp(sig->s, mpone) < 0 || mpcmp(sig->s, pub->q) >= 0)
143ff48bf5SDavid du Colombier 		return rv;
153ff48bf5SDavid du Colombier 	u1 = mpnew(0);
163ff48bf5SDavid du Colombier 	u2 = mpnew(0);
173ff48bf5SDavid du Colombier 	v = mpnew(0);
183ff48bf5SDavid du Colombier 	sinv = mpnew(0);
193ff48bf5SDavid du Colombier 
203ff48bf5SDavid du Colombier 	// find (s**-1) mod q, make sure it exists
213ff48bf5SDavid du Colombier 	mpextendedgcd(sig->s, pub->q, u1, sinv, v);
223ff48bf5SDavid du Colombier 	if(mpcmp(u1, mpone) != 0)
233ff48bf5SDavid du Colombier 		goto out;
243ff48bf5SDavid du Colombier 
253ff48bf5SDavid du Colombier 	// u1 = (sinv * m) mod q, u2 = (r * sinv) mod q
263ff48bf5SDavid du Colombier 	mpmul(sinv, m, u1);
273ff48bf5SDavid du Colombier 	mpmod(u1, pub->q, u1);
283ff48bf5SDavid du Colombier 	mpmul(sig->r, sinv, u2);
293ff48bf5SDavid du Colombier 	mpmod(u2, pub->q, u2);
303ff48bf5SDavid du Colombier 
313ff48bf5SDavid du Colombier 	// v = (((alpha**u1)*(key**u2)) mod p) mod q
323ff48bf5SDavid du Colombier 	mpexp(pub->alpha, u1, pub->p, sinv);
333ff48bf5SDavid du Colombier 	mpexp(pub->key, u2, pub->p, v);
343ff48bf5SDavid du Colombier 	mpmul(sinv, v, v);
353ff48bf5SDavid du Colombier 	mpmod(v, pub->p, v);
363ff48bf5SDavid du Colombier 	mpmod(v, pub->q, v);
373ff48bf5SDavid du Colombier 
383ff48bf5SDavid du Colombier 	if(mpcmp(v, sig->r) == 0)
393ff48bf5SDavid du Colombier 		rv = 0;
403ff48bf5SDavid du Colombier out:
413ff48bf5SDavid du Colombier 	mpfree(v);
423ff48bf5SDavid du Colombier 	mpfree(u1);
433ff48bf5SDavid du Colombier 	mpfree(u2);
443ff48bf5SDavid du Colombier 	mpfree(sinv);
453ff48bf5SDavid du Colombier 	return rv;
463ff48bf5SDavid du Colombier }
47