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