a
This commit is contained in:
46
libsec/dsaverify.c
Normal file
46
libsec/dsaverify.c
Normal file
@ -0,0 +1,46 @@
|
||||
#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(sig->r->sign < 0 || mpcmp(sig->r, pub->q) >= 0)
|
||||
return rv;
|
||||
if(sig->s->sign < 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;
|
||||
}
|
Reference in New Issue
Block a user