#include "os.h" | |
#include <mp.h> | |
#include <libsec.h> | |
int | |
dsaverify(DSApub *pub, DSAsig *sig, mpint *m) | |
{ | |
int rv = -1; | |
mpint *u1, *u2, *v, *sinv; | |
if(mpcmp(sig->r, mpone) < 0 || mpcmp(sig->r, pub->q) >= 0) | |
return rv; | |
if(mpcmp(sig->s, mpone) < 0 || mpcmp(sig->s, pub->q) >= 0) | |
return rv; | |
u1 = mpnew(0); | |
u2 = mpnew(0); | |
v = mpnew(0); | |
sinv = mpnew(0); | |
// find (s**-1) mod q, make sure it exists | |
mpextendedgcd(sig->s, pub->q, u1, sinv, v); | |
if(mpcmp(u1, mpone) != 0) | |
goto out; | |
// u1 = (sinv * m) mod q, u2 = (r * sinv) mod q | |
mpmul(sinv, m, u1); | |
mpmod(u1, pub->q, u1); | |
mpmul(sig->r, sinv, u2); | |
mpmod(u2, pub->q, u2); | |
// v = (((alpha**u1)*(key**u2)) mod p) mod q | |
mpexp(pub->alpha, u1, pub->p, sinv); | |
mpexp(pub->key, u2, pub->p, v); | |
mpmul(sinv, v, v); | |
mpmod(v, pub->p, v); | |
mpmod(v, pub->q, v); | |
if(mpcmp(v, sig->r) == 0) | |
rv = 0; | |
out: | |
mpfree(v); | |
mpfree(u1); | |
mpfree(u2); | |
mpfree(sinv); | |
return rv; | |
} |