| #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; |
| } |