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