xref: /plan9/sys/src/libsec/port/egverify.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
1*80ee5cbfSDavid du Colombier #include "os.h"
2*80ee5cbfSDavid du Colombier #include <mp.h>
3*80ee5cbfSDavid du Colombier #include <libsec.h>
4*80ee5cbfSDavid du Colombier 
5*80ee5cbfSDavid du Colombier int
egverify(EGpub * pub,EGsig * sig,mpint * m)6*80ee5cbfSDavid du Colombier egverify(EGpub *pub, EGsig *sig, mpint *m)
7*80ee5cbfSDavid du Colombier {
8*80ee5cbfSDavid du Colombier 	mpint *p = pub->p, *alpha = pub->alpha;
9*80ee5cbfSDavid du Colombier 	mpint *r = sig->r, *s = sig->s;
10*80ee5cbfSDavid du Colombier 	mpint *v1, *v2, *rs;
11*80ee5cbfSDavid du Colombier 	int rv = -1;
12*80ee5cbfSDavid du Colombier 
13*80ee5cbfSDavid du Colombier 	if(mpcmp(r, mpone) < 0 || mpcmp(r, p) >= 0)
14*80ee5cbfSDavid du Colombier 		return rv;
15*80ee5cbfSDavid du Colombier 	v1 = mpnew(0);
16*80ee5cbfSDavid du Colombier 	rs = mpnew(0);
17*80ee5cbfSDavid du Colombier 	v2 = mpnew(0);
18*80ee5cbfSDavid du Colombier 	mpexp(pub->key, r, p, v1);
19*80ee5cbfSDavid du Colombier 	mpexp(r, s, p, rs);
20*80ee5cbfSDavid du Colombier 	mpmul(v1, rs, v1);
21*80ee5cbfSDavid du Colombier 	mpmod(v1, p, v1);
22*80ee5cbfSDavid du Colombier 	mpexp(alpha, m, p, v2);
23*80ee5cbfSDavid du Colombier 	if(mpcmp(v1, v2) == 0)
24*80ee5cbfSDavid du Colombier 		rv = 0;
25*80ee5cbfSDavid du Colombier 	mpfree(v1);
26*80ee5cbfSDavid du Colombier 	mpfree(rs);
27*80ee5cbfSDavid du Colombier 	mpfree(v2);
28*80ee5cbfSDavid du Colombier 	return rv;
29*80ee5cbfSDavid du Colombier }
30